gluesql_core/data/
string_ext.rs

1use {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}