use just_fmt::kebab_case;
use proc_macro::TokenStream;
use proc_macro2::TokenStream as TokenStream2;
use quote::quote;
use syn::parse::{Parse, ParseStream};
use syn::{LitStr, Result as SynResult};
struct NodeInput {
path: LitStr,
}
impl Parse for NodeInput {
fn parse(input: ParseStream) -> SynResult<Self> {
Ok(NodeInput {
path: input.parse()?,
})
}
}
pub fn node(input: TokenStream) -> TokenStream {
let input_parsed = syn::parse_macro_input!(input as NodeInput);
let path_str = input_parsed.path.value();
if path_str.is_empty() {
return quote! {
mingling::Node::default()
}
.into();
}
let parts: Vec<String> = path_str
.split('.')
.map(|s| kebab_case!(s).to_string())
.collect();
let mut expr: TokenStream2 = quote! {
mingling::Node::default()
};
for part in parts {
expr = quote! {
#expr.join(#part)
};
}
expr.into()
}