1 | /// Converts the casing style of a `&'static str` constant, |
2 | /// ignoring non-ascii unicode characters. |
3 | /// |
4 | /// This nacro is equivalent to a function with this signature: |
5 | /// |
6 | /// ```rust |
7 | /// const fn map_ascii_case(case: const_format::Case, input: &'static str) -> &'static str |
8 | /// # {"" } |
9 | /// ``` |
10 | /// |
11 | /// The [`Case`](enum.Case.html) parameter determines the casing style of the returned string. |
12 | /// |
13 | /// # Ascii |
14 | /// |
15 | /// This only transforms ascii characters because broader unicode case conversion, |
16 | /// while possible, is much harder to implement purely with `const fn`s. |
17 | /// |
18 | /// Non-ascii characters are treated as though they're alphabetic ascii characters. |
19 | /// |
20 | /// # Ignored characters |
21 | /// |
22 | /// These casing styles treat non-alphanumeric ascii characters as spaces, |
23 | /// removing them from the returned string: |
24 | /// |
25 | /// - `Case::Pascal` |
26 | /// - `Case::Camel` |
27 | /// - `Case::Snake` |
28 | /// - `Case::UpperSnake` |
29 | /// - `Case::Kebab` |
30 | /// - `Case::UpperKebab` |
31 | /// |
32 | /// # Example |
33 | /// |
34 | /// ```rust |
35 | /// use const_format::{Case, map_ascii_case}; |
36 | /// |
37 | /// { |
38 | /// const LOW: &str = map_ascii_case!(Case::Lower, "hello WORLD" ); |
39 | /// assert_eq!(LOW, "hello world" ); |
40 | /// } |
41 | /// { |
42 | /// const IN: &str = "hello WORLD каждому" ; |
43 | /// const OUT: &str = map_ascii_case!(Case::Upper, IN); |
44 | /// // non-ascii characters are ignored by map_ascii_case. |
45 | /// assert_eq!(OUT, "HELLO WORLD каждому" ); |
46 | /// } |
47 | /// |
48 | /// const IN2: &str = "hello fooкаждому100Bar#qux" ; |
49 | /// { |
50 | /// const OUT: &str = map_ascii_case!(Case::Pascal, IN2); |
51 | /// assert_eq!(OUT, "HelloFooкаждому100BarQux" ); |
52 | /// } |
53 | /// { |
54 | /// const OUT: &str = map_ascii_case!(Case::Camel, IN2); |
55 | /// assert_eq!(OUT, "helloFooкаждому100BarQux" ); |
56 | /// } |
57 | /// { |
58 | /// const OUT: &str = map_ascii_case!(Case::Snake, IN2); |
59 | /// assert_eq!(OUT, "hello_fooкаждому_100_bar_qux" ); |
60 | /// } |
61 | /// { |
62 | /// const OUT: &str = map_ascii_case!(Case::UpperSnake, IN2); |
63 | /// assert_eq!(OUT, "HELLO_FOOкаждому_100_BAR_QUX" ); |
64 | /// } |
65 | /// { |
66 | /// const OUT: &str = map_ascii_case!(Case::Kebab, IN2); |
67 | /// assert_eq!(OUT, "hello-fooкаждому-100-bar-qux" ); |
68 | /// } |
69 | /// { |
70 | /// const OUT: &str = map_ascii_case!(Case::UpperKebab, IN2); |
71 | /// assert_eq!(OUT, "HELLO-FOOкаждому-100-BAR-QUX" ); |
72 | /// } |
73 | /// |
74 | /// |
75 | /// ``` |
76 | #[macro_export ] |
77 | macro_rules! map_ascii_case { |
78 | ($case:expr, $str:expr) => { |
79 | $crate::__str_const! {{ |
80 | const S_OSRCTFL4A: &$crate::pmr::str = $str; |
81 | const CASE_OSRCTFL4A: $crate::Case = $case; |
82 | { |
83 | const L: $crate::pmr::usize = |
84 | $crate::__ascii_case_conv::size_after_conversion(CASE_OSRCTFL4A, S_OSRCTFL4A); |
85 | |
86 | const OB: &[$crate::pmr::u8; L] = |
87 | &$crate::__ascii_case_conv::convert_str::<L>(CASE_OSRCTFL4A, S_OSRCTFL4A); |
88 | |
89 | const OS: &$crate::pmr::str = unsafe { $crate::__priv_transmute_bytes_to_str!(OB) }; |
90 | |
91 | OS |
92 | } |
93 | }} |
94 | }; |
95 | } |
96 | |