use proc_macro2::{Ident, Span, TokenStream}; use quote::quote; use syn::{Error, ItemFn}; pub fn expand(name: Option, input: ItemFn) -> Result { let crate_name = match name { Some(v) => v, None => match std::env::var("CARGO_PKG_NAME") { Ok(v) => v, Err(_) => { return Err(Error::new( Span::call_site(), r#"missing (name = "...") attribute"#, )) } }, }; let extern_init_name = Ident::new( &format!("Init_{}", crate_name.replace('-', "_")), Span::call_site(), ); let init_name = input.sig.ident.clone(); Ok(quote! { #input #[allow(non_snake_case)] #[no_mangle] pub unsafe extern "C" fn #extern_init_name() { use magnus::method::{Init, RubyInit}; #init_name.call_handle_error() } }) }