strconv/
lib.rs

1use proc_macro::TokenStream;
2use syn::{parse_macro_input, LitStr};
3
4#[proc_macro]
5pub fn kebab2title(input: TokenStream) -> TokenStream {
6    let input_str = parse_macro_input!(input as LitStr).value();
7
8    let converted = kebab2title_impl(&input_str);
9    format!("\"{converted}\"").parse().unwrap()
10}
11
12fn kebab2title_impl(data: &str) -> String {
13    let mut result = String::with_capacity(data.len());
14    let mut capitalize_next = true;
15
16    for c in data.chars() {
17        if c == '-' {
18            result.push(' ');
19            capitalize_next = true;
20        } else if capitalize_next {
21            result.push(c.to_ascii_uppercase());
22            capitalize_next = false;
23        } else {
24            result.push(c);
25        }
26    }
27
28    result
29}