use quote::{format_ident, quote};
use syn::{Ident, Type};
pub struct Namer;
impl Namer {
pub fn name_struct(rust_ty_name: &Ident) -> Ident {
let prefix = crate::CONFIG.type_prefix();
let suffix = crate::CONFIG.type_suffix();
let ffi_ty_name = format!("{prefix}{rust_ty_name}{suffix}");
let ffi_ty_name = crate::CONFIG.type_case_style().format(&ffi_ty_name);
format_ident!("{}", ffi_ty_name)
}
pub fn name_fn(rust_fn_name: &Ident, impl_ty: Option<&Type>) -> syn::Result<Ident> {
let config = &*crate::CONFIG;
let ffi_fn_name = if let Some(ty) = impl_ty {
let ffi_ty_name = match ty {
syn::Type::Path(type_path) => {
let rust_ty_name = type_path.path.segments.last().unwrap().ident.clone();
Self::name_struct(&rust_ty_name)
}
_ => {
return Err(syn::Error::new_spanned(
ty,
format!("cannot name an FFI fn for type `{}`", quote!(#ty)),
));
}
};
let raw = format!(
"{}{}_{}{}",
config.methods_prefix(),
ffi_ty_name,
rust_fn_name,
config.methods_suffix(),
);
config.methods_case_style().format(&raw)
} else {
let raw = format!(
"{}{}{}",
config.fns_prefix(),
rust_fn_name,
config.fns_suffix(),
);
config.fns_case_style().format(&raw)
};
Ok(format_ident!("{}", ffi_fn_name))
}
pub fn name_free_fn(rust_ty_name: &Ident) -> Ident {
let prefix = crate::CONFIG.free_fns_prefix();
let suffix = crate::CONFIG.free_fns_suffix();
let ffi_ty_name = Self::name_struct(rust_ty_name);
let ffi_free_fn_name = format!("{prefix}{ffi_ty_name}{suffix}");
let ffi_free_fn_name = crate::CONFIG
.free_fns_case_style()
.format(&ffi_free_fn_name);
format_ident!("{}", ffi_free_fn_name)
}
}