use proc_macro::TokenStream;
use quote::quote;
use syn::{parse_macro_input, DeriveInput, LitStr};
#[proc_macro_derive(SyncState, attributes(sync_state))]
pub fn derive_sync_state(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as DeriveInput);
if matches!(input.data, syn::Data::Union(_)) {
return syn::Error::new_spanned(
&input.ident,
"#[derive(SyncState)] cannot be applied to unions",
)
.to_compile_error()
.into();
}
let ident = &input.ident;
let mut name = ident.to_string();
for attr in &input.attrs {
if attr.path().is_ident("sync_state") {
let result = attr.parse_nested_meta(|meta| {
if meta.path.is_ident("name") {
let lit: LitStr = meta.value()?.parse()?;
name = lit.value();
}
Ok(())
});
if let Err(e) = result {
return e.to_compile_error().into();
}
}
}
let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl();
quote! {
impl #impl_generics ::tauri_plugin_sync_state::SyncState for #ident #ty_generics #where_clause {
const NAME: &'static str = #name;
}
}
.into()
}