oxidate_macros/
lib.rs

1use derive_syn_parse::Parse;
2use proc_macro::TokenStream;
3use proc_macro_roids::DeriveInputExt;
4use quote::quote;
5use syn::{parse_macro_input, parse_quote, DeriveInput};
6
7mod kw {
8    syn::custom_keyword!(copy);
9}
10
11#[derive(Debug, Parse)]
12struct AliasOptions {
13    copy: Option<kw::copy>,
14}
15
16macro_rules! derive_alias {
17    ($name:ident => $($token:tt)*) => {
18        #[proc_macro_attribute]
19        pub fn $name(args: TokenStream, item: TokenStream) -> TokenStream {
20            let mut ast = parse_macro_input!(item as DeriveInput);
21            let args = parse_macro_input!(args as AliasOptions);
22
23            let mut derives = parse_quote!($($token)*);
24
25            if args.copy.is_some() {
26                derives = parse_quote!(#derives, Copy);
27            }
28
29            ast.append_derives(derives);
30
31            TokenStream::from(quote! { #ast })
32        }
33    };
34}
35
36derive_alias!(data => Debug, Clone);
37derive_alias!(key => Debug, Clone, Eq, PartialEq, Hash);
38derive_alias!(base => Debug);