1extern crate proc_macro;
6use proc_macro::TokenStream;
7use pyo3_derive_backend::{
8 build_derive_from_pyobject, build_py_class, build_py_function, build_py_methods,
9 build_py_proto, get_doc, process_functions_in_module, py_init, PyClassArgs, PyFunctionAttr,
10};
11use quote::quote;
12use syn::parse_macro_input;
13
14#[proc_macro_attribute]
17pub fn pymodule(attr: TokenStream, input: TokenStream) -> TokenStream {
18 let mut ast = parse_macro_input!(input as syn::ItemFn);
19
20 let modname = if attr.is_empty() {
21 ast.sig.ident.clone()
22 } else {
23 parse_macro_input!(attr as syn::Ident)
24 };
25
26 if let Err(err) = process_functions_in_module(&mut ast) {
27 return err.to_compile_error().into();
28 }
29
30 let doc = match get_doc(&ast.attrs, None, false) {
31 Ok(doc) => doc,
32 Err(err) => return err.to_compile_error().into(),
33 };
34
35 let expanded = py_init(&ast.sig.ident, &modname, doc);
36
37 quote!(
38 #ast
39 #expanded
40 )
41 .into()
42}
43
44#[proc_macro_attribute]
45pub fn pyproto(_: TokenStream, input: TokenStream) -> TokenStream {
46 let mut ast = parse_macro_input!(input as syn::ItemImpl);
47 let expanded = build_py_proto(&mut ast).unwrap_or_else(|e| e.to_compile_error());
48
49 quote!(
50 #ast
51 #expanded
52 )
53 .into()
54}
55
56#[proc_macro_attribute]
57pub fn pyclass(attr: TokenStream, input: TokenStream) -> TokenStream {
58 let mut ast = parse_macro_input!(input as syn::ItemStruct);
59 let args = parse_macro_input!(attr as PyClassArgs);
60 let expanded = build_py_class(&mut ast, &args).unwrap_or_else(|e| e.to_compile_error());
61
62 quote!(
63 #ast
64 #expanded
65 )
66 .into()
67}
68
69#[proc_macro_attribute]
70pub fn pymethods(_: TokenStream, input: TokenStream) -> TokenStream {
71 let mut ast = parse_macro_input!(input as syn::ItemImpl);
72 let expanded = build_py_methods(&mut ast).unwrap_or_else(|e| e.to_compile_error());
73
74 quote!(
75 #ast
76 #expanded
77 )
78 .into()
79}
80
81#[proc_macro_attribute]
82pub fn pyfunction(attr: TokenStream, input: TokenStream) -> TokenStream {
83 let mut ast = parse_macro_input!(input as syn::ItemFn);
84 let args = parse_macro_input!(attr as PyFunctionAttr);
85
86 let expanded = build_py_function(&mut ast, args).unwrap_or_else(|e| e.to_compile_error());
87
88 quote!(
89 #ast
90 #expanded
91 )
92 .into()
93}
94
95#[proc_macro_derive(FromPyObject, attributes(pyo3, extract))]
96pub fn derive_from_py_object(item: TokenStream) -> TokenStream {
97 let ast = parse_macro_input!(item as syn::DeriveInput);
98 let expanded = build_derive_from_pyobject(&ast).unwrap_or_else(|e| e.to_compile_error());
99 quote!(
100 #expanded
101 )
102 .into()
103}