gluesql_core/data/
string_ext.rs1use {crate::result::Result, regex::Regex, serde::Serialize, thiserror::Error};
2
3#[derive(Error, Serialize, Debug, PartialEq, Eq)]
4pub enum StringExtError {
5 #[error("unreachable literal unary operation")]
6 UnreachablePatternParsing,
7}
8
9pub trait StringExt {
10 fn like(&self, pattern: &str, case_sensitive: bool) -> Result<bool>;
11}
12
13impl StringExt for str {
14 fn like(&self, pattern: &str, case_sensitive: bool) -> Result<bool> {
15 let (match_string, match_pattern) = if case_sensitive {
16 (self.to_owned(), pattern.to_owned())
17 } else {
18 let lowercase_string = self.to_lowercase();
19 let lowercase_pattern = pattern.to_lowercase();
20
21 (lowercase_string, lowercase_pattern)
22 };
23
24 Ok(Regex::new(&format!(
25 "^{}$",
26 regex::escape(match_pattern.as_str())
27 .replace('%', ".*")
28 .replace('_', ".")
29 ))
30 .map_err(|_| StringExtError::UnreachablePatternParsing)?
31 .is_match(match_string.as_str()))
32 }
33}