pyo3_stub_gen_derive/
gen_stub.rs1mod arg;
79mod attr;
80mod member;
81mod method;
82mod parse_python;
83mod pyclass;
84mod pyclass_complex_enum;
85mod pyclass_enum;
86mod pyfunction;
87mod pymethods;
88mod renaming;
89mod signature;
90mod stub_type;
91mod util;
92mod variant;
93
94use arg::*;
95use attr::*;
96use member::*;
97use method::*;
98use pyclass::*;
99use pyclass_complex_enum::*;
100use pyclass_enum::*;
101use pyfunction::*;
102use pymethods::*;
103use renaming::*;
104use signature::*;
105use stub_type::*;
106use util::*;
107
108use proc_macro2::TokenStream as TokenStream2;
109use quote::quote;
110use syn::{parse2, ItemEnum, ItemFn, ItemImpl, ItemStruct, LitStr, Result};
111
112pub fn pyclass(item: TokenStream2) -> Result<TokenStream2> {
113 let mut item_struct = parse2::<ItemStruct>(item)?;
114 let inner = PyClassInfo::try_from(item_struct.clone())?;
115 let derive_stub_type = StubType::from(&inner);
116 pyclass::prune_attrs(&mut item_struct);
117 Ok(quote! {
118 #item_struct
119 #derive_stub_type
120 pyo3_stub_gen::inventory::submit! {
121 #inner
122 }
123 })
124}
125
126pub fn pyclass_enum(item: TokenStream2) -> Result<TokenStream2> {
127 let inner = PyEnumInfo::try_from(parse2::<ItemEnum>(item.clone())?)?;
128 let derive_stub_type = StubType::from(&inner);
129 Ok(quote! {
130 #item
131 #derive_stub_type
132 pyo3_stub_gen::inventory::submit! {
133 #inner
134 }
135 })
136}
137
138pub fn pyclass_complex_enum(item: TokenStream2) -> Result<TokenStream2> {
139 let inner = PyComplexEnumInfo::try_from(parse2::<ItemEnum>(item.clone())?)?;
140 let derive_stub_type = StubType::from(&inner);
141 Ok(quote! {
142 #item
143 #derive_stub_type
144 pyo3_stub_gen::inventory::submit! {
145 #inner
146 }
147 })
148}
149
150pub fn pymethods(item: TokenStream2) -> Result<TokenStream2> {
151 let mut item_impl = parse2::<ItemImpl>(item)?;
152 let inner = PyMethodsInfo::try_from(item_impl.clone())?;
153 pymethods::prune_attrs(&mut item_impl);
154 Ok(quote! {
155 #item_impl
156 #[automatically_derived]
157 pyo3_stub_gen::inventory::submit! {
158 #inner
159 }
160 })
161}
162
163pub fn pyfunction(attr: TokenStream2, item: TokenStream2) -> Result<TokenStream2> {
164 let mut item_fn = parse2::<ItemFn>(item)?;
165 let mut inner = PyFunctionInfo::try_from(item_fn.clone())?;
166 let python_stub = inner.parse_attr(attr)?;
167 pyfunction::prune_attrs(&mut item_fn);
168
169 if let Some(stub_str) = python_stub {
171 let python_inner = parse_python::parse_python_function_stub(stub_str)?;
172 Ok(quote! {
173 #item_fn
174 #[automatically_derived]
175 pyo3_stub_gen::inventory::submit! {
176 #python_inner
177 }
178 })
179 } else {
180 Ok(quote! {
181 #item_fn
182 #[automatically_derived]
183 pyo3_stub_gen::inventory::submit! {
184 #inner
185 }
186 })
187 }
188}
189
190pub fn gen_function_from_python_impl(input: TokenStream2) -> Result<TokenStream2> {
191 let stub_str: LitStr = parse2(input)?;
192 let inner = parse_python::parse_python_function_stub(stub_str)?;
193 Ok(quote! { #inner })
194}
195
196pub fn gen_methods_from_python_impl(input: TokenStream2) -> Result<TokenStream2> {
197 let stub_str: LitStr = parse2(input)?;
198 let inner = parse_python::parse_python_methods_stub(&stub_str)?;
199 Ok(quote! { #inner })
200}
201
202pub fn prune_gen_stub(item: TokenStream2) -> Result<TokenStream2> {
203 fn prune_attrs<T: syn::parse::Parse + quote::ToTokens>(
204 item: &TokenStream2,
205 fn_prune_attrs: fn(&mut T),
206 ) -> Result<TokenStream2> {
207 parse2::<T>(item.clone()).map(|mut item| {
208 fn_prune_attrs(&mut item);
209 quote! { #item }
210 })
211 }
212 prune_attrs::<ItemStruct>(&item, pyclass::prune_attrs)
213 .or_else(|_| prune_attrs::<ItemImpl>(&item, pymethods::prune_attrs))
214 .or_else(|_| prune_attrs::<ItemFn>(&item, pyfunction::prune_attrs))
215}