inflector/cases/snakecase/mod.rs
1#![deny(warnings)]
2use cases::case::*;
3/// Converts a `&str` to `snake_case` `String`
4///
5/// ```
6/// use inflector::cases::snakecase::to_snake_case;
7/// let mock_string: &str = "foo_bar";
8/// let expected_string: String = "foo_bar".to_string();
9/// let asserted_string: String = to_snake_case(mock_string);
10/// assert!(asserted_string == expected_string);
11///
12/// ```
13/// ```
14/// use inflector::cases::snakecase::to_snake_case;
15/// let mock_string: &str = "HTTP Foo bar";
16/// let expected_string: String = "http_foo_bar".to_string();
17/// let asserted_string: String = to_snake_case(mock_string);
18/// assert!(asserted_string == expected_string);
19///
20/// ```
21/// ```
22/// use inflector::cases::snakecase::to_snake_case;
23/// let mock_string: &str = "HTTPFooBar";
24/// let expected_string: String = "http_foo_bar".to_string();
25/// let asserted_string: String = to_snake_case(mock_string);
26/// assert!(asserted_string == expected_string);
27///
28/// ```
29/// ```
30/// use inflector::cases::snakecase::to_snake_case;
31/// let mock_string: &str = "Foo bar";
32/// let expected_string: String = "foo_bar".to_string();
33/// let asserted_string: String = to_snake_case(mock_string);
34/// assert!(asserted_string == expected_string);
35///
36/// ```
37/// ```
38/// use inflector::cases::snakecase::to_snake_case;
39/// let mock_string: &str = "Foo Bar";
40/// let expected_string: String = "foo_bar".to_string();
41/// let asserted_string: String = to_snake_case(mock_string);
42/// assert!(asserted_string == expected_string);
43///
44/// ```
45/// ```
46/// use inflector::cases::snakecase::to_snake_case;
47/// let mock_string: &str = "FooBar";
48/// let expected_string: String = "foo_bar".to_string();
49/// let asserted_string: String = to_snake_case(mock_string);
50/// assert!(asserted_string == expected_string);
51///
52/// ```
53/// ```
54/// use inflector::cases::snakecase::to_snake_case;
55/// let mock_string: &str = "FOO_BAR";
56/// let expected_string: String = "foo_bar".to_string();
57/// let asserted_string: String = to_snake_case(mock_string);
58/// assert!(asserted_string == expected_string);
59///
60/// ```
61/// ```
62/// use inflector::cases::snakecase::to_snake_case;
63/// let mock_string: &str = "fooBar";
64/// let expected_string: String = "foo_bar".to_string();
65/// let asserted_string: String = to_snake_case(mock_string);
66/// assert!(asserted_string == expected_string);
67///
68/// ```
69/// ```
70/// use inflector::cases::snakecase::to_snake_case;
71/// let mock_string: &str = "fooBar3";
72/// let expected_string: String = "foo_bar_3".to_string();
73/// let asserted_string: String = to_snake_case(mock_string);
74/// assert!(asserted_string == expected_string);
75///
76/// ```
77pub fn to_snake_case(non_snake_case_string: &str) -> String {
78 to_case_snake_like(non_snake_case_string, "_", "lower")
79}
80
81/// Determines of a `&str` is `snake_case`
82///
83/// ```
84/// use inflector::cases::snakecase::is_snake_case;
85/// let mock_string: &str = "Foo bar string that is really really long";
86/// let asserted_bool: bool = is_snake_case(mock_string);
87/// assert!(asserted_bool == false);
88///
89/// ```
90/// ```
91/// use inflector::cases::snakecase::is_snake_case;
92/// let mock_string: &str = "foo-bar-string-that-is-really-really-long";
93/// let asserted_bool: bool = is_snake_case(mock_string);
94/// assert!(asserted_bool == false);
95///
96/// ```
97/// ```
98/// use inflector::cases::snakecase::is_snake_case;
99/// let mock_string: &str = "FooBarIsAReallyReallyLongString";
100/// let asserted_bool: bool = is_snake_case(mock_string);
101/// assert!(asserted_bool == false);
102///
103/// ```
104/// ```
105/// use inflector::cases::snakecase::is_snake_case;
106/// let mock_string: &str = "Foo Bar Is A Really Really Long String";
107/// let asserted_bool: bool = is_snake_case(mock_string);
108/// assert!(asserted_bool == false);
109///
110/// ```
111/// ```
112/// use inflector::cases::snakecase::is_snake_case;
113/// let mock_string: &str = "FOO_BAR_IS_A_REALLY_REALLY_LONG_STRING";
114/// let asserted_bool: bool = is_snake_case(mock_string);
115/// assert!(asserted_bool == false);
116///
117/// ```
118/// ```
119/// use inflector::cases::snakecase::is_snake_case;
120/// let mock_string: &str = "fooBarIsAReallyReallyLongString";
121/// let asserted_bool: bool = is_snake_case(mock_string);
122/// assert!(asserted_bool == false);
123///
124/// ```
125/// ```
126/// use inflector::cases::snakecase::is_snake_case;
127/// let mock_string: &str = "foo_bar_string_that_is_really_really_long";
128/// let asserted_bool: bool = is_snake_case(mock_string);
129/// assert!(asserted_bool == true);
130///
131/// ```
132/// ```
133/// use inflector::cases::snakecase::is_snake_case;
134/// let mock_string: &str = "foo_bar1_string_that_is_really_really_long";
135/// let asserted_bool: bool = is_snake_case(mock_string);
136/// assert!(asserted_bool == false);
137///
138/// ```
139/// ```
140/// use inflector::cases::snakecase::is_snake_case;
141/// let mock_string: &str = "foo_bar_1_string_that_is_really_really_long";
142/// let asserted_bool: bool = is_snake_case(mock_string);
143/// assert!(asserted_bool == true);
144///
145/// ```
146pub fn is_snake_case(test_string: &str) -> bool {
147 test_string == to_snake_case(test_string.clone())
148}
149
150#[cfg(all(feature = "unstable", test))]
151mod benchmarks {
152 extern crate test;
153 use self::test::Bencher;
154
155 #[bench]
156 fn bench_snake_from_title(b: &mut Bencher) {
157 b.iter(|| super::to_snake_case("Foo bar"));
158 }
159
160 #[bench]
161 fn bench_snake_from_camel(b: &mut Bencher) {
162 b.iter(|| super::to_snake_case("fooBar"));
163 }
164
165 #[bench]
166 fn bench_snake_from_snake(b: &mut Bencher) {
167 b.iter(|| super::to_snake_case("foo_bar_bar_bar"));
168 }
169
170 #[bench]
171 fn bench_is_snake(b: &mut Bencher) {
172 b.iter(|| super::is_snake_case("Foo bar"));
173 }
174
175}
176
177#[cfg(test)]
178mod tests {
179 use ::to_snake_case;
180 use ::is_snake_case;
181
182 #[test]
183 fn from_camel_case() {
184 let convertable_string: String = "fooBar".to_owned();
185 let expected: String = "foo_bar".to_owned();
186 assert_eq!(to_snake_case(&convertable_string), expected)
187 }
188
189 #[test]
190 fn from_pascal_case() {
191 let convertable_string: String = "FooBar".to_owned();
192 let expected: String = "foo_bar".to_owned();
193 assert_eq!(to_snake_case(&convertable_string), expected)
194 }
195
196 #[test]
197 fn from_kebab_case() {
198 let convertable_string: String = "foo-bar".to_owned();
199 let expected: String = "foo_bar".to_owned();
200 assert_eq!(to_snake_case(&convertable_string), expected)
201 }
202
203 #[test]
204 fn from_sentence_case() {
205 let convertable_string: String = "Foo bar".to_owned();
206 let expected: String = "foo_bar".to_owned();
207 assert_eq!(to_snake_case(&convertable_string), expected)
208 }
209
210 #[test]
211 fn from_title_case() {
212 let convertable_string: String = "Foo Bar".to_owned();
213 let expected: String = "foo_bar".to_owned();
214 assert_eq!(to_snake_case(&convertable_string), expected)
215 }
216
217 #[test]
218 fn from_train_case() {
219 let convertable_string: String = "Foo-Bar".to_owned();
220 let expected: String = "foo_bar".to_owned();
221 assert_eq!(to_snake_case(&convertable_string), expected)
222 }
223
224 #[test]
225 fn from_screaming_snake_case() {
226 let convertable_string: String = "FOO_BAR".to_owned();
227 let expected: String = "foo_bar".to_owned();
228 assert_eq!(to_snake_case(&convertable_string), expected)
229 }
230
231 #[test]
232 fn from_snake_case() {
233 let convertable_string: String = "foo_bar".to_owned();
234 let expected: String = "foo_bar".to_owned();
235 assert_eq!(to_snake_case(&convertable_string), expected)
236 }
237
238 #[test]
239 fn from_case_with_loads_of_space() {
240 let convertable_string: String = "foo bar".to_owned();
241 let expected: String = "foo_bar".to_owned();
242 assert_eq!(to_snake_case(&convertable_string), expected)
243 }
244
245 #[test]
246 fn a_name_with_a_dot() {
247 let convertable_string: String = "Robert C. Martin".to_owned();
248 let expected: String = "robert_c_martin".to_owned();
249 assert_eq!(to_snake_case(&convertable_string), expected)
250 }
251
252 #[test]
253 fn random_text_with_bad_chars() {
254 let convertable_string: String = "Random text with *(bad) chars".to_owned();
255 let expected: String = "random_text_with_bad_chars".to_owned();
256 assert_eq!(to_snake_case(&convertable_string), expected)
257 }
258
259 #[test]
260 fn trailing_bad_chars() {
261 let convertable_string: String = "trailing bad_chars*(()())".to_owned();
262 let expected: String = "trailing_bad_chars".to_owned();
263 assert_eq!(to_snake_case(&convertable_string), expected)
264 }
265
266 #[test]
267 fn leading_bad_chars() {
268 let convertable_string: String = "-!#$%leading bad chars".to_owned();
269 let expected: String = "leading_bad_chars".to_owned();
270 assert_eq!(to_snake_case(&convertable_string), expected)
271 }
272
273 #[test]
274 fn wrapped_in_bad_chars() {
275 let convertable_string: String = "-!#$%wrapped in bad chars&*^*&(&*^&(<><?>><?><>))".to_owned();
276 let expected: String = "wrapped_in_bad_chars".to_owned();
277 assert_eq!(to_snake_case(&convertable_string), expected)
278 }
279
280 #[test]
281 fn has_a_sign() {
282 let convertable_string: String = "has a + sign".to_owned();
283 let expected: String = "has_a_sign".to_owned();
284 assert_eq!(to_snake_case(&convertable_string), expected)
285 }
286
287 #[test]
288 fn is_correct_from_camel_case() {
289 let convertable_string: String = "fooBar".to_owned();
290 assert_eq!(is_snake_case(&convertable_string), false)
291 }
292
293 #[test]
294 fn is_correct_from_pascal_case() {
295 let convertable_string: String = "FooBar".to_owned();
296 assert_eq!(is_snake_case(&convertable_string), false)
297 }
298
299 #[test]
300 fn is_correct_from_kebab_case() {
301 let convertable_string: String = "foo-bar".to_owned();
302 assert_eq!(is_snake_case(&convertable_string), false)
303 }
304
305 #[test]
306 fn is_correct_from_sentence_case() {
307 let convertable_string: String = "Foo bar".to_owned();
308 assert_eq!(is_snake_case(&convertable_string), false)
309 }
310
311 #[test]
312 fn is_correct_from_title_case() {
313 let convertable_string: String = "Foo Bar".to_owned();
314 assert_eq!(is_snake_case(&convertable_string), false)
315 }
316
317 #[test]
318 fn is_correct_from_train_case() {
319 let convertable_string: String = "Foo-Bar".to_owned();
320 assert_eq!(is_snake_case(&convertable_string), false)
321 }
322
323 #[test]
324 fn is_correct_from_screaming_snake_case() {
325 let convertable_string: String = "FOO_BAR".to_owned();
326 assert_eq!(is_snake_case(&convertable_string), false)
327 }
328
329 #[test]
330 fn is_correct_from_snake_case() {
331 let convertable_string: String = "foo_bar".to_owned();
332 assert_eq!(is_snake_case(&convertable_string), true)
333 }
334}