]>
Commit | Line | Data |
---|---|---|
5869c6ff XL |
1 | use crate::{capitalize, transform}; |
2 | ||
0731742a XL |
3 | /// This trait defines a camel case conversion. |
4 | /// | |
5 | /// In CamelCase, word boundaries are indicated by capital letters, including | |
6 | /// the first word. | |
7 | /// | |
8 | /// ## Example: | |
9 | /// | |
10 | /// ```rust | |
5869c6ff | 11 | /// use heck::CamelCase; |
0731742a | 12 | /// |
5869c6ff XL |
13 | /// let sentence = "We are not in the least afraid of ruins."; |
14 | /// assert_eq!(sentence.to_camel_case(), "WeAreNotInTheLeastAfraidOfRuins"); | |
0731742a XL |
15 | /// ``` |
16 | pub trait CamelCase: ToOwned { | |
17 | /// Convert this type to camel case. | |
18 | fn to_camel_case(&self) -> Self::Owned; | |
19 | } | |
20 | ||
21 | impl CamelCase for str { | |
22 | fn to_camel_case(&self) -> String { | |
5869c6ff | 23 | transform(self, capitalize, |_| {}) |
0731742a XL |
24 | } |
25 | } | |
26 | ||
27 | #[cfg(test)] | |
28 | mod tests { | |
29 | use super::CamelCase; | |
30 | ||
31 | macro_rules! t { | |
32 | ($t:ident : $s1:expr => $s2:expr) => { | |
33 | #[test] | |
34 | fn $t() { | |
35 | assert_eq!($s1.to_camel_case(), $s2) | |
36 | } | |
136023e0 | 37 | }; |
0731742a XL |
38 | } |
39 | ||
40 | t!(test1: "CamelCase" => "CamelCase"); | |
41 | t!(test2: "This is Human case." => "ThisIsHumanCase"); | |
42 | t!(test3: "MixedUP_CamelCase, with some Spaces" => "MixedUpCamelCaseWithSomeSpaces"); | |
43 | t!(test4: "mixed_up_ snake_case, with some _spaces" => "MixedUpSnakeCaseWithSomeSpaces"); | |
44 | t!(test5: "kebab-case" => "KebabCase"); | |
45 | t!(test6: "SHOUTY_SNAKE_CASE" => "ShoutySnakeCase"); | |
46 | t!(test7: "snake_case" => "SnakeCase"); | |
47 | t!(test8: "this-contains_ ALLKinds OfWord_Boundaries" => "ThisContainsAllKindsOfWordBoundaries"); | |
48 | t!(test9: "XΣXΣ baffle" => "XσxςBaffle"); | |
49 | t!(test10: "XMLHttpRequest" => "XmlHttpRequest"); | |
50 | } |