aboutsummaryrefslogtreecommitdiff
path: root/macros/src/libs/intertrait_macros/gen_caster.rs
diff options
context:
space:
mode:
authorHampusM <hampus@hampusmat.com>2022-07-24 11:02:33 +0200
committerHampusM <hampus@hampusmat.com>2022-07-24 11:02:33 +0200
commit613cd7129439d04f576325bcf55d276847efb136 (patch)
tree3dc1c300b1b492fca1aeaa7410969347b54737fc /macros/src/libs/intertrait_macros/gen_caster.rs
parentbd70e925f773de338c93cfd2ff720ef11aaa0848 (diff)
refactor: clean up intertrait lib
Diffstat (limited to 'macros/src/libs/intertrait_macros/gen_caster.rs')
-rw-r--r--macros/src/libs/intertrait_macros/gen_caster.rs33
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)
}