diff --git a/.rustfmt.toml b/.rustfmt.toml new file mode 100644 index 0000000..4d7dd9e --- /dev/null +++ b/.rustfmt.toml @@ -0,0 +1,3 @@ +imports_granularity = "Crate" +newline_style = "Unix" +group_imports = "StdExternalCrate" \ No newline at end of file diff --git a/accursed-unutterable-type-id-derive/src/lib.rs b/accursed-unutterable-type-id-derive/src/lib.rs new file mode 100644 index 0000000..c386026 --- /dev/null +++ b/accursed-unutterable-type-id-derive/src/lib.rs @@ -0,0 +1,27 @@ +use proc_macro::TokenStream; +use quote::quote; +use syn::{parse_macro_input, DeriveInput}; + +#[proc_macro_derive(AccursedUnutterablyTypeIdentified)] +pub fn my_macro(input: TokenStream) -> TokenStream { + let input = parse_macro_input!(input as DeriveInput); + + let name = input.ident; + + // SAFETY: We literally are the proc macro. and we have made sure that no duplicate type ids + // will ever happen, right? :ferrisClueless: + let expanded = quote! { + unsafe impl ::accursed_unutterable_type_id::AccursedUnutterablyTypeIdentified for #name { + fn type_id() -> ::accursed_unutterable_type_id::AccursedUnutterableTypeId { + ::accursed_unutterable_type_id::AccursedUnutterableTypeId( + ::accursed_unutterable_type_id::InternalAccursedUnutterableTypeId::new( + 0 + ) + ) + } + } + }; + + // Hand the output tokens back to the compiler + TokenStream::from(expanded) +} diff --git a/examples/one.rs b/examples/one.rs new file mode 100644 index 0000000..0660e99 --- /dev/null +++ b/examples/one.rs @@ -0,0 +1,14 @@ +use accursed_unutterable_type_id::{AccursedUnutterableTypeId, AccursedUnutterablyTypeIdentified}; + +#[derive(AccursedUnutterablyTypeIdentified)] +struct Uwu; + +#[derive(AccursedUnutterablyTypeIdentified)] +struct Owo; + +fn main() { + let uwu_id = AccursedUnutterableTypeId::of::(); + let owo_id = AccursedUnutterableTypeId::of::(); + + assert_ne!(uwu_id, owo_id); +}