Skip to main content

wi_macros/
lib.rs

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    // eprintln!("{out}");
35    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    // eprintln!("{out}");
43    out
44}