scsys_util/str/
impl_alloc.rs

1/*
2    Appellation: impl_alloc <str>
3    Contrib: @FL03
4*/
5use alloc::string::{String, ToString};
6use core::str::Chars;
7
8/// Remove the first and last charecters of a string
9pub fn fnl_remove(data: impl ToString) -> String {
10    let data = data.to_string();
11    let mut chars = data.chars();
12    chars.next();
13    chars.next_back();
14    chars.as_str().to_string()
15}
16/// converts a string to camelCase.
17pub fn to_camelcase<T: AsRef<str>>(s: T) -> String {
18    fn _camelcase<'a>(mut chars: Chars<'a>) -> String {
19        chars
20            .clone()
21            .enumerate()
22            .fold(String::new(), |mut acc, (i, c)| {
23                match i {
24                    0 => acc.push(c.to_lowercase().next().unwrap()),
25                    _ => {
26                        if c == '_' {
27                            // Skip the underscore and convert the next character to uppercase
28                            if let Some(next) = chars.next() {
29                                acc.push(next.to_uppercase().next().unwrap());
30                            }
31                        } else {
32                            acc.push(c);
33                        }
34                    }
35                }
36                acc
37            })
38    }
39    _camelcase(s.as_ref().chars())
40}
41/// converts a string to PascalCase.
42pub fn to_pascalcase<T: AsRef<str>>(s: T) -> String {
43    fn _pascalcase<'a>(chars: Chars<'a>) -> String {
44        chars.enumerate().fold(String::new(), |mut acc, (i, c)| {
45            match i {
46                0 => acc.push(c.to_uppercase().next().unwrap()),
47                _ => {
48                    if c.is_uppercase() {
49                        acc.push(c.to_lowercase().next().unwrap());
50                    } else {
51                        acc.push(c);
52                    }
53                }
54            }
55            acc
56        })
57    }
58
59    _pascalcase(s.as_ref().chars())
60}
61/// converts a string to kebab-case.
62pub fn to_kebabcase<T: AsRef<str>>(s: T) -> String {
63    fn _kebabcase<'a>(chars: Chars<'a>) -> String {
64        chars
65            .fold(String::new(), |mut acc, c| {
66                if c.is_uppercase() {
67                    if !acc.is_empty() {
68                        acc.push('-');
69                    }
70                    acc.push(c.to_lowercase().next().unwrap());
71                } else {
72                    acc.push(c);
73                }
74                acc
75            })
76            .to_lowercase()
77    }
78    _kebabcase(s.as_ref().chars())
79}
80/// converts a string to snake_case.
81pub fn to_snakecase<T: AsRef<str>>(s: T) -> String {
82    fn _snakecase<'a>(chars: Chars<'a>) -> String {
83        chars
84            .fold(String::new(), |mut acc, c| {
85                if c.is_uppercase() {
86                    if !acc.is_empty() {
87                        acc.push('_');
88                    }
89                    acc.push(c.to_lowercase().next().unwrap());
90                } else {
91                    acc.push(c);
92                }
93                acc
94            })
95            .to_lowercase()
96    }
97    _snakecase(s.as_ref().chars())
98}
99/// converts a string to SCREAMING_SNAKE_CASE.
100pub fn to_screaming_snakecase<T: AsRef<str>>(s: T) -> String {
101    fn _screaming_snakecase<'a>(chars: Chars<'a>) -> String {
102        chars.fold(String::new(), |mut acc, c| {
103            if c.is_uppercase() {
104                if !acc.is_empty() {
105                    acc.push('_');
106                }
107                acc.push(c);
108            } else {
109                acc.push(c.to_uppercase().next().unwrap());
110            }
111            acc
112        })
113    }
114    _screaming_snakecase(s.as_ref().chars())
115}