OneLauncher-Cracked/packages/macro/src/specta.rs
2025-07-25 11:54:07 +02:00

43 lines
977 B
Rust

use proc_macro2::TokenStream;
use quote::quote;
use syn::meta::ParseNestedMeta;
use syn::{Item, parse_macro_input};
pub fn specta(
attr: proc_macro::TokenStream,
item: proc_macro::TokenStream,
) -> proc_macro::TokenStream {
let mut attrs = SpectaAttributes::default();
let parser = syn::meta::parser(|meta| attrs.parse(&meta));
parse_macro_input!(attr with parser);
let input = parse_macro_input!(item as Item);
let specta_rename = attrs.rename.map_or_else(TokenStream::new, |rename| {
quote! {
#[cfg_attr(feature = "specta", specta(rename = #rename))]
}
});
let expanded = quote! {
#[cfg_attr(feature = "specta", derive(specta::Type))]
#specta_rename
#input
};
expanded.into()
}
#[derive(Default)]
struct SpectaAttributes {
rename: Option<String>,
}
impl SpectaAttributes {
fn parse(&mut self, meta: &ParseNestedMeta) -> syn::Result<()> {
if meta.path.is_ident("rename") {
self.rename = Some(meta.value()?.to_string());
}
Ok(())
}
}