pyo3_stub_gen_derive/lib.rs
1mod gen_stub;
2
3use proc_macro::TokenStream;
4
5/// Embed metadata for Python stub file generation for `#[pyclass]` macro
6///
7/// ```
8/// #[pyo3_stub_gen_derive::gen_stub_pyclass]
9/// #[pyo3::pyclass(mapping, module = "my_module", name = "Placeholder")]
10/// #[derive(Debug, Clone)]
11/// pub struct PyPlaceholder {
12/// #[pyo3(get)]
13/// pub name: String,
14/// #[pyo3(get)]
15/// pub ndim: usize,
16/// #[pyo3(get)]
17/// pub description: Option<String>,
18/// pub custom_latex: Option<String>,
19/// }
20/// ```
21#[proc_macro_attribute]
22pub fn gen_stub_pyclass(_attr: TokenStream, item: TokenStream) -> TokenStream {
23 gen_stub::pyclass(item.into())
24 .unwrap_or_else(|err| err.to_compile_error())
25 .into()
26}
27
28/// Embed metadata for Python stub file generation for `#[pyclass]` macro with enum
29///
30/// ```
31/// #[pyo3_stub_gen_derive::gen_stub_pyclass_enum]
32/// #[pyo3::pyclass(module = "my_module", name = "DataType")]
33/// #[derive(Debug, Clone, PartialEq, Eq, Hash)]
34/// pub enum PyDataType {
35/// #[pyo3(name = "FLOAT")]
36/// Float,
37/// #[pyo3(name = "INTEGER")]
38/// Integer,
39/// }
40/// ```
41#[proc_macro_attribute]
42pub fn gen_stub_pyclass_enum(_attr: TokenStream, item: TokenStream) -> TokenStream {
43 gen_stub::pyclass_enum(item.into())
44 .unwrap_or_else(|err| err.to_compile_error())
45 .into()
46}
47
48/// Embed metadata for Python stub file generation for `#[pyclass]` macro with a complex enum
49///
50/// ```
51/// #[pyo3_stub_gen_derive::gen_stub_pyclass_complex_enum]
52/// #[pyo3::pyclass(module = "my_module", name = "DataType")]
53/// #[derive(Debug, Clone)]
54/// pub enum PyDataType {
55/// #[pyo3(name = "FLOAT")]
56/// Float{f: f64},
57/// #[pyo3(name = "INTEGER")]
58/// Integer(i64),
59/// }
60/// ```
61#[proc_macro_attribute]
62pub fn gen_stub_pyclass_complex_enum(_attr: TokenStream, item: TokenStream) -> TokenStream {
63 gen_stub::pyclass_complex_enum(item.into())
64 .unwrap_or_else(|err| err.to_compile_error())
65 .into()
66}
67
68/// Embed metadata for Python stub file generation for `#[pymethods]` macro
69///
70/// ```
71/// #[pyo3_stub_gen_derive::gen_stub_pyclass]
72/// #[pyo3::pyclass]
73/// struct A {}
74///
75/// #[pyo3_stub_gen_derive::gen_stub_pymethods]
76/// #[pyo3::pymethods]
77/// impl A {
78/// #[getter]
79/// fn f(&self) -> Vec<u32> {
80/// todo!()
81/// }
82/// }
83/// ```
84#[proc_macro_attribute]
85pub fn gen_stub_pymethods(_attr: TokenStream, item: TokenStream) -> TokenStream {
86 gen_stub::pymethods(item.into())
87 .unwrap_or_else(|err| err.to_compile_error())
88 .into()
89}
90
91/// Embed metadata for Python stub file generation for `#[pyfunction]` macro
92///
93/// ```
94/// #[pyo3_stub_gen_derive::gen_stub_pyfunction]
95/// #[pyo3::pyfunction]
96/// #[pyo3(name = "is_odd")]
97/// pub fn is_odd(x: u32) -> bool {
98/// todo!()
99/// }
100/// ```
101///
102/// The function attributed by `#[gen_stub_pyfunction]` will be appended to default stub file.
103/// If you want to append this function to another module, add `module` attribute.
104///
105/// ```
106/// #[pyo3_stub_gen_derive::gen_stub_pyfunction(module = "my_module.experimental")]
107/// #[pyo3::pyfunction]
108/// #[pyo3(name = "is_odd")]
109/// pub fn is_odd(x: u32) -> bool {
110/// todo!()
111/// }
112/// ```
113#[proc_macro_attribute]
114pub fn gen_stub_pyfunction(attr: TokenStream, item: TokenStream) -> TokenStream {
115 gen_stub::pyfunction(attr.into(), item.into())
116 .unwrap_or_else(|err| err.to_compile_error())
117 .into()
118}