knuckles_macro/
lib.rs

1extern crate proc_macro;
2
3use proc_macro::TokenStream;
4use quote::quote;
5use syn::{parse_macro_input, Item};
6
7fn extract_ident(item: &Item) -> Option<syn::Ident> {
8    match item {
9        Item::Struct(s) => Some(s.ident.clone()),
10        Item::Enum(e) => Some(e.ident.clone()),
11        _ => None,
12    }
13}
14
15#[proc_macro_attribute]
16pub fn pydefault(_: TokenStream, item: TokenStream) -> TokenStream {
17    let item = parse_macro_input!(item as Item);
18    let python_new = quote! {
19        #[new]
20        fn python_new(str: &str) -> Self {
21            Self::new(str)
22        }
23    };
24    let repr = quote! {
25        fn __repr__(&self) -> String {
26            format!("{:?}", self)
27        }
28    };
29    if let Some(ident) = extract_ident(&item) {
30        let expander = quote! {
31            #[pymethods]
32            #[allow(non_snake_case)]
33            impl #ident {
34                #python_new
35                #repr
36            }
37            #item
38        };
39        TokenStream::from(expander)
40    } else {
41        TokenStream::from(quote! { #item })
42    }
43}