struct BuildInput {
package_name: LitStr,
commands: Vec<Ident>,
}
impl Parse for BuildInput {
fn parse(input: ParseStream) -> syn::Result<Self> {
let package_name: LitStr = input.parse()?;
let _: Token![,] = input.parse()?;
let mut commands = Vec::new();
loop {
if input.is_empty() {
break;
}
let name: Ident = input.parse()?;
commands.push(name);
if input.parse::<Token![,]>().is_err() {
break;
}
}
if commands.is_empty() {
return Err(syn::Error::new(
package_name.span(),
"build! requires at least one command function after the package name",
));
}
Ok(BuildInput {
package_name,
commands,
})
}
}
#[proc_macro]
pub fn build(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as BuildInput);
let package_name = &input.package_name;
let chain: TokenStream2 = input
.commands
.iter()
.map(command_chain_entry)
.collect();
let expanded = quote! {
rustra::Package::builder(#package_name) #chain
};
expanded.into()
}