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