diff options
author | HampusM <hampus@hampusmat.com> | 2022-07-24 11:02:33 +0200 |
---|---|---|
committer | HampusM <hampus@hampusmat.com> | 2022-07-24 11:02:33 +0200 |
commit | 613cd7129439d04f576325bcf55d276847efb136 (patch) | |
tree | 3dc1c300b1b492fca1aeaa7410969347b54737fc /macros/src/libs/intertrait_macros | |
parent | bd70e925f773de338c93cfd2ff720ef11aaa0848 (diff) |
refactor: clean up intertrait lib
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) } |