diff options
Diffstat (limited to 'macros/src/libs/intertrait_macros')
| -rw-r--r-- | macros/src/libs/intertrait_macros/gen_caster.rs | 33 | 
1 files changed, 20 insertions, 13 deletions
| diff --git a/macros/src/libs/intertrait_macros/gen_caster.rs b/macros/src/libs/intertrait_macros/gen_caster.rs index 9126200..d77262a 100644 --- a/macros/src/libs/intertrait_macros/gen_caster.rs +++ b/macros/src/libs/intertrait_macros/gen_caster.rs @@ -11,8 +11,9 @@   * at your option.  */ -use std::str::from_utf8_unchecked; +use std::str::from_utf8; +use proc_macro2::Ident;  use proc_macro2::TokenStream;  use quote::format_ident;  use quote::quote; @@ -20,14 +21,16 @@ use quote::ToTokens;  use uuid::adapter::Simple;  use uuid::Uuid; -pub fn generate_caster(ty: &impl ToTokens, trait_: &impl ToTokens) -> TokenStream -{ -    let mut fn_buf = [0u8; FN_BUF_LEN]; +const CASTER_FN_NAME_PREFIX: &[u8] = b"__"; + +const FN_BUF_LEN: usize = CASTER_FN_NAME_PREFIX.len() + Simple::LENGTH; -    let fn_ident = format_ident!("{}", new_fn_name(&mut fn_buf)); +pub fn generate_caster(ty: &impl ToTokens, dst_trait: &impl ToTokens) -> TokenStream +{ +    let fn_ident = create_caster_fn_ident();      let new_caster = quote! { -        syrette::libs::intertrait::Caster::<dyn #trait_>::new( +        syrette::libs::intertrait::Caster::<dyn #dst_trait>::new(              |from| from.downcast::<#ty>().unwrap(),              |from| from.downcast::<#ty>().unwrap(),          ) @@ -42,14 +45,18 @@ pub fn generate_caster(ty: &impl ToTokens, trait_: &impl ToTokens) -> TokenStrea      }  } -const FN_PREFIX: &[u8] = b"__"; -const FN_BUF_LEN: usize = FN_PREFIX.len() + Simple::LENGTH; - -fn new_fn_name(buf: &mut [u8]) -> &str +fn create_caster_fn_ident() -> Ident  { -    buf[..FN_PREFIX.len()].copy_from_slice(FN_PREFIX); +    let buf = &mut [0u8; FN_BUF_LEN]; + +    buf[..CASTER_FN_NAME_PREFIX.len()].copy_from_slice(CASTER_FN_NAME_PREFIX); +      Uuid::new_v4()          .to_simple() -        .encode_lower(&mut buf[FN_PREFIX.len()..]); -    unsafe { from_utf8_unchecked(&buf[..FN_BUF_LEN]) } +        .encode_lower(&mut buf[CASTER_FN_NAME_PREFIX.len()..]); + +    let fn_name = +        from_utf8(&buf[..FN_BUF_LEN]).expect("Created caster function name is not UTF-8"); + +    format_ident!("{}", fn_name)  } | 
