use quote::format_ident;
use syn::{
parse_quote, punctuated::Punctuated, token::Comma, Error, Expr, FnArg, Ident, Pat, Signature,
};
pub fn extract_caller_args(sig: &Signature) -> Result<Punctuated<Expr, Comma>, Error> {
let mut args = Punctuated::new();
for arg in &sig.inputs {
if let FnArg::Typed(t) = arg {
if let Pat::Ident(arg_ident) = &*t.pat {
args.push(parse_quote! { #arg_ident });
} else {
return Err(Error::new_spanned(
&t.pat,
"unexpected pattern in function argument",
));
}
}
}
Ok(args)
}
pub fn alias_guard_name(trait_name: &Ident) -> Ident {
format_ident!("__MustNotAnAlias__{}", trait_name)
}
pub fn namespace_guard_name(namespace: &str) -> Ident {
format_ident!("__NamespaceGuard__{}", namespace)
}
pub fn extern_fn_name(namespace: Option<&str>, trait_name: &Ident, fn_name: &Ident) -> Ident {
if let Some(ns) = namespace {
format_ident!("__{}_{}_{}", ns, trait_name, fn_name)
} else {
format_ident!("__{}_{}", trait_name, fn_name)
}
}
pub fn extern_fn_mod_name(trait_name: &Ident) -> Ident {
format_ident!("__{}_mod", trait_name)
}