oxidate-macros 0.1.0

Helper macros for oxidate
Documentation
use derive_syn_parse::Parse;
use proc_macro::TokenStream;
use proc_macro_roids::DeriveInputExt;
use quote::quote;
use syn::{parse_macro_input, parse_quote, DeriveInput};

mod kw {
    syn::custom_keyword!(copy);
}

#[derive(Debug, Parse)]
struct AliasOptions {
    copy: Option<kw::copy>,
}

macro_rules! derive_alias {
    ($name:ident => $($token:tt)*) => {
        #[proc_macro_attribute]
        pub fn $name(args: TokenStream, item: TokenStream) -> TokenStream {
            let mut ast = parse_macro_input!(item as DeriveInput);
            let args = parse_macro_input!(args as AliasOptions);

            let mut derives = parse_quote!($($token)*);

            if args.copy.is_some() {
                derives = parse_quote!(#derives, Copy);
            }

            ast.append_derives(derives);

            TokenStream::from(quote! { #ast })
        }
    };
}

derive_alias!(data => Debug, Clone);
derive_alias!(key => Debug, Clone, Eq, PartialEq, Hash);
derive_alias!(base => Debug);