ezffi-macros 0.1.1

Proc-macros backing the ezffi crate
Documentation
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)
    }
}