1use proc_macro::TokenStream as TokenStream1;
2
3mod impl_enum;
4mod kind;
5
6pub(crate) mod prelude {
7 pub use proc_macro2::{Span, TokenStream};
8 pub use quote::{quote_spanned, ToTokens};
9 pub use syn::{
10 parse::{Parse, ParseStream},
11 spanned::Spanned,
12 };
13
14 pub trait SpanExt {
15 fn error(self, msg: impl std::fmt::Display) -> syn::Error;
16 }
17
18 impl<T: Into<Span>> SpanExt for T {
19 fn error(self, msg: impl std::fmt::Display) -> syn::Error {
20 syn::Error::new(self.into(), msg)
21 }
22 }
23}
24
25#[proc_macro_attribute]
26pub fn impl_enum(attr: TokenStream1, input: TokenStream1) -> TokenStream1 {
27 #![expect(clippy::let_and_return)]
28
29 let mut args = impl_enum::Args::default();
30 let parser = args.parser();
31 syn::parse_macro_input!(attr with parser);
32
33 let out = impl_enum::run(args, syn::parse_macro_input!(input)).into();
34 out
36}
37
38#[proc_macro_derive(Kind, attributes(kind))]
39pub fn kind(input: TokenStream1) -> TokenStream1 {
40 #![expect(clippy::let_and_return)]
41 let out = kind::run(syn::parse_macro_input!(input)).into();
42 out
44}