tauri-plugin-sync-state-macros 0.1.0

Derive macro (#[derive(SyncState)]) for tauri-plugin-sync-state.
Documentation
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()
}