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}