grace_cli/core/case/
string.rs

1use recase::ReCase;
2use regex::Regex;
3
4/// Case variants into which the string can be recased.
5#[derive(PartialEq, Debug)]
6pub enum Case {
7    Alternating,
8    Snake,
9    Camel,
10    Kebab,
11    Dot,
12    Header,
13    Normal,
14    Original,
15    Pascal,
16    Path,
17    Sentence,
18    Title,
19    UpperSnake,
20    WindowsPath,
21}
22
23fn new_case<T>(string_to_recase: T) -> ReCase
24where
25    T: Into<String>,
26{
27    recase::ReCase::new(string_to_recase)
28}
29
30/// Recase a string into the specified case.
31pub fn recase<T>(string_to_recase: T, into: Case) -> String
32where
33    T: Into<String>,
34{
35    let recase = new_case(string_to_recase);
36
37    match into {
38        Case::Alternating => recase.alternating_case(),
39        Case::Snake => recase.snake_case(),
40        Case::Camel => recase.camel_case(),
41        Case::Kebab => recase.kebab_case(),
42        Case::Dot => recase.dot_case(),
43        Case::Header => recase.header_case(),
44        Case::Normal => recase.normal_case(),
45        Case::Original => recase.original_case(),
46        Case::Pascal => recase.pascal_case(),
47        Case::Path => recase.path_case(),
48        Case::Sentence => recase.sentence_case(),
49        Case::Title => recase.title_case(),
50        Case::UpperSnake => recase.upper_snake_case(),
51        Case::WindowsPath => recase.windows_path_case(),
52    }
53}
54
55/// Sanitize a string by removing all characters that are not alphanumeric.
56/// The only characters that are allowed are: `a-z`, `A-Z`, `0-9`, `_`, and `-`.
57/// Used regex is `r"[\(\)’@#<>+«»~&%^—,!\.\[\]{}\?:;`·']"`
58pub fn sanitize(str_to_sanitize: &str) -> String {
59    let pattern = r"[\(\)’@#<>+«»~&%^—,!\.\[\]{}\?:;`·']";
60    let regex = Regex::new(pattern).unwrap();
61    let replaced_text = regex.replace_all(str_to_sanitize, "");
62
63    replaced_text.to_string()
64}
65
66#[cfg(test)]
67mod tests {
68    use super::*;
69
70    #[test]
71    fn new_case_test() {
72        let test_string = "Example String";
73
74        let new_from_str = new_case(test_string);
75        let new_from_string = new_case(test_string.to_string());
76
77        assert!(new_from_str.original_case() == "Example String");
78        assert!(new_from_string.original_case() == "Example String");
79    }
80}