use proc_macro2::Span;
use quote::quote;
use smallvec::{smallvec, SmallVec};
use syn::Token;
pub fn snake_case(ident: &str) -> String {
ident
.chars()
.enumerate()
.flat_map(|(i, c)| {
let chars: SmallVec<[char; 2]> = if c.is_uppercase() {
if i == 0 {
c.to_lowercase().collect()
} else {
std::iter::once('_').chain(c.to_lowercase()).collect()
}
} else {
smallvec![c]
};
chars
})
.collect()
}
pub fn underscore_generics(num_generics: usize) -> proc_macro2::TokenStream {
let underscore = Token);
let underscores = std::iter::repeat_n(quote! { #underscore }, num_generics);
quote! { <#(#underscores),*> }
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn snake_case_correct() {
assert_eq!(snake_case("BeaconBlock"), "beacon_block");
assert_eq!(snake_case("SignedBeaconBlock"), "signed_beacon_block");
assert_eq!(snake_case("StoreDHT"), "store_d_h_t"); assert_eq!(snake_case("hello_world"), "hello_world");
assert_eq!(snake_case("__"), "__");
}
}