Simplify SQL string::slug function implementation

This commit is contained in:
Tobie Morgan Hitchcock 2022-07-04 10:41:18 +01:00
parent 508538e0cc
commit 8ca211f96d
5 changed files with 30 additions and 15 deletions

15
Cargo.lock generated
View file

@ -614,9 +614,9 @@ dependencies = [
[[package]] [[package]]
name = "deunicode" name = "deunicode"
version = "0.4.3" version = "1.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "850878694b7933ca4c9569d30a34b55031b9b139ee1fc7b94a527c4ef960d690" checksum = "f2c9736e15e7df1638a7f6eee92a6511615c738246a052af5ba86f039b65aede"
[[package]] [[package]]
name = "digest" name = "digest"
@ -2575,15 +2575,6 @@ version = "0.4.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32" checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32"
[[package]]
name = "slug"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b3bc762e6a4b6c6fcaade73e77f9ebc6991b676f88bb2358bddb56560f073373"
dependencies = [
"deunicode",
]
[[package]] [[package]]
name = "smallvec" name = "smallvec"
version = "1.8.0" version = "1.8.0"
@ -2694,6 +2685,7 @@ dependencies = [
"bigdecimal", "bigdecimal",
"boa_engine", "boa_engine",
"chrono", "chrono",
"deunicode",
"dmp", "dmp",
"echodb", "echodb",
"futures 0.3.21", "futures 0.3.21",
@ -2715,7 +2707,6 @@ dependencies = [
"serde", "serde",
"sha-1 0.10.0", "sha-1 0.10.0",
"sha2", "sha2",
"slug",
"storekey", "storekey",
"surrealdb-derive", "surrealdb-derive",
"thiserror", "thiserror",

View file

@ -22,6 +22,7 @@ boa = { version = "0.15.0", package = "boa_engine", optional = true }
channel = { version = "1.6.1", package = "async-channel" } channel = { version = "1.6.1", package = "async-channel" }
chrono = { version = "0.4.19", features = ["serde"] } chrono = { version = "0.4.19", features = ["serde"] }
derive = { version = "0.3.0", package = "surrealdb-derive" } derive = { version = "0.3.0", package = "surrealdb-derive" }
deunicode = "1.3.1"
dmp = "0.1.1" dmp = "0.1.1"
echodb = { version = "0.3.0", optional = true } echodb = { version = "0.3.0", optional = true }
executor = { version = "1.4.1", package = "async-executor", optional = true } executor = { version = "1.4.1", package = "async-executor", optional = true }
@ -44,7 +45,6 @@ scrypt = "0.10.0"
serde = { version = "1.0.138", features = ["derive"] } serde = { version = "1.0.138", features = ["derive"] }
sha-1 = "0.10.0" sha-1 = "0.10.0"
sha2 = "0.10.2" sha2 = "0.10.2"
slug = "0.1.4"
storekey = "0.3.0" storekey = "0.3.0"
thiserror = "1.0.31" thiserror = "1.0.31"
tikv = { version = "0.1.0", package = "tikv-client", optional = true } tikv = { version = "0.1.0", package = "tikv-client", optional = true }

View file

@ -1,7 +1,7 @@
use crate::ctx::Context; use crate::ctx::Context;
use crate::err::Error; use crate::err::Error;
use crate::fnc::util::string;
use crate::sql::value::Value; use crate::sql::value::Value;
use slug::slugify;
pub fn concat(_: &Context, args: Vec<Value>) -> Result<Value, Error> { pub fn concat(_: &Context, args: Vec<Value>) -> Result<Value, Error> {
Ok(args.into_iter().map(|x| x.as_string()).collect::<Vec<_>>().concat().into()) Ok(args.into_iter().map(|x| x.as_string()).collect::<Vec<_>>().concat().into())
@ -56,7 +56,7 @@ pub fn slice(_: &Context, mut args: Vec<Value>) -> Result<Value, Error> {
} }
pub fn slug(_: &Context, mut args: Vec<Value>) -> Result<Value, Error> { pub fn slug(_: &Context, mut args: Vec<Value>) -> Result<Value, Error> {
Ok(slugify(&args.remove(0).as_string()).into()) Ok(string::slug(&args.remove(0).as_string()).into())
} }
pub fn split(_: &Context, mut args: Vec<Value>) -> Result<Value, Error> { pub fn split(_: &Context, mut args: Vec<Value>) -> Result<Value, Error> {

View file

@ -1,3 +1,4 @@
pub mod geo; pub mod geo;
pub mod http; pub mod http;
pub mod math; pub mod math;
pub mod string;

View file

@ -0,0 +1,23 @@
use deunicode::deunicode;
use once_cell::sync::Lazy;
use regex::Regex;
static SIMPLES: Lazy<Regex> = Lazy::new(|| Regex::new("[^a-z0-9-_]").unwrap());
static HYPHENS: Lazy<Regex> = Lazy::new(|| Regex::new("-+").unwrap());
pub fn slug<S: AsRef<str>>(s: S) -> String {
// Get a reference
let s = s.as_ref();
// Convert unicode to ascii
let s = deunicode(s);
// Convert strgin to lowercase
let s = s.to_ascii_lowercase();
// Replace any non-simple characters
let s = SIMPLES.replace_all(s.as_ref(), "-");
// Replace any duplicated hyphens
let s = HYPHENS.replace_all(s.as_ref(), "-");
// Remove any surrounding hyphens
let s = s.trim_matches('-');
// Return the string
s.to_owned()
}