1use serde::{Deserialize, Serialize};
2use std::collections::HashMap;
3use std::path::PathBuf;
4
5use super::extras::Language;
6
7#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct PythonConfig {
9 pub module_name: Option<String>,
10 pub async_runtime: Option<String>,
11 pub stubs: Option<StubsConfig>,
12 #[serde(default)]
16 pub pip_name: Option<String>,
17 #[serde(default)]
20 pub features: Option<Vec<String>>,
21 #[serde(default)]
24 pub serde_rename_all: Option<String>,
25 #[serde(default)]
29 pub capsule_types: HashMap<String, String>,
30 #[serde(default)]
33 pub release_gil: bool,
34 #[serde(default)]
36 pub exclude_functions: Vec<String>,
37 #[serde(default)]
39 pub exclude_types: Vec<String>,
40 #[serde(default)]
42 pub extra_dependencies: HashMap<String, toml::Value>,
43 #[serde(default)]
45 pub scaffold_output: Option<PathBuf>,
46}
47
48#[derive(Debug, Clone, Serialize, Deserialize)]
49pub struct StubsConfig {
50 pub output: PathBuf,
51}
52
53#[derive(Debug, Clone, Serialize, Deserialize)]
54pub struct NodeConfig {
55 pub package_name: Option<String>,
56 #[serde(default)]
59 pub features: Option<Vec<String>>,
60 #[serde(default)]
63 pub serde_rename_all: Option<String>,
64 #[serde(default)]
67 pub type_prefix: Option<String>,
68 #[serde(default)]
70 pub exclude_functions: Vec<String>,
71 #[serde(default)]
73 pub exclude_types: Vec<String>,
74 #[serde(default)]
76 pub extra_dependencies: HashMap<String, toml::Value>,
77 #[serde(default)]
79 pub scaffold_output: Option<PathBuf>,
80}
81
82#[derive(Debug, Clone, Serialize, Deserialize)]
83pub struct RubyConfig {
84 pub gem_name: Option<String>,
85 pub stubs: Option<StubsConfig>,
86 #[serde(default)]
89 pub features: Option<Vec<String>>,
90 #[serde(default)]
93 pub serde_rename_all: Option<String>,
94 #[serde(default)]
96 pub extra_dependencies: HashMap<String, toml::Value>,
97 #[serde(default)]
99 pub scaffold_output: Option<PathBuf>,
100}
101
102#[derive(Debug, Clone, Serialize, Deserialize)]
103pub struct PhpConfig {
104 pub extension_name: Option<String>,
105 #[serde(default)]
108 pub feature_gate: Option<String>,
109 #[serde(default)]
111 pub stubs: Option<StubsConfig>,
112 #[serde(default)]
113 pub features: Option<Vec<String>>,
114 #[serde(default)]
117 pub serde_rename_all: Option<String>,
118 #[serde(default)]
120 pub exclude_functions: Vec<String>,
121 #[serde(default)]
123 pub exclude_types: Vec<String>,
124 #[serde(default)]
126 pub extra_dependencies: HashMap<String, toml::Value>,
127 #[serde(default)]
129 pub scaffold_output: Option<PathBuf>,
130}
131
132#[derive(Debug, Clone, Serialize, Deserialize)]
133pub struct ElixirConfig {
134 pub app_name: Option<String>,
135 #[serde(default)]
136 pub features: Option<Vec<String>>,
137 #[serde(default)]
140 pub serde_rename_all: Option<String>,
141 #[serde(default)]
143 pub exclude_functions: Vec<String>,
144 #[serde(default)]
146 pub exclude_types: Vec<String>,
147 #[serde(default)]
149 pub extra_dependencies: HashMap<String, toml::Value>,
150 #[serde(default)]
152 pub scaffold_output: Option<PathBuf>,
153}
154
155#[derive(Debug, Clone, Serialize, Deserialize)]
156pub struct WasmConfig {
157 #[serde(default)]
158 pub exclude_functions: Vec<String>,
159 #[serde(default)]
160 pub exclude_types: Vec<String>,
161 #[serde(default)]
162 pub type_overrides: HashMap<String, String>,
163 #[serde(default)]
164 pub features: Option<Vec<String>>,
165 #[serde(default)]
168 pub serde_rename_all: Option<String>,
169 #[serde(default)]
172 pub type_prefix: Option<String>,
173 #[serde(default)]
176 pub exclude_reexports: Vec<String>,
177 #[serde(default)]
179 pub env_shims: Vec<String>,
180}
181
182#[derive(Debug, Clone, Serialize, Deserialize)]
183pub struct FfiConfig {
184 pub prefix: Option<String>,
185 #[serde(default = "default_error_style")]
186 pub error_style: String,
187 pub header_name: Option<String>,
188 #[serde(default)]
191 pub lib_name: Option<String>,
192 #[serde(default)]
194 pub visitor_callbacks: bool,
195 #[serde(default)]
196 pub features: Option<Vec<String>>,
197 #[serde(default)]
200 pub serde_rename_all: Option<String>,
201 #[serde(default)]
203 pub exclude_functions: Vec<String>,
204 #[serde(default)]
206 pub exclude_types: Vec<String>,
207}
208
209fn default_error_style() -> String {
210 "last_error".to_string()
211}
212
213#[derive(Debug, Clone, Serialize, Deserialize)]
214pub struct GoConfig {
215 pub module: Option<String>,
216 pub package_name: Option<String>,
218 #[serde(default)]
219 pub features: Option<Vec<String>>,
220 #[serde(default)]
223 pub serde_rename_all: Option<String>,
224}
225
226#[derive(Debug, Clone, Serialize, Deserialize)]
227pub struct JavaConfig {
228 pub package: Option<String>,
229 #[serde(default = "default_java_ffi_style")]
230 pub ffi_style: String,
231 #[serde(default)]
232 pub features: Option<Vec<String>>,
233 #[serde(default)]
236 pub serde_rename_all: Option<String>,
237}
238
239fn default_java_ffi_style() -> String {
240 "panama".to_string()
241}
242
243#[derive(Debug, Clone, Serialize, Deserialize)]
244pub struct CSharpConfig {
245 pub namespace: Option<String>,
246 pub target_framework: Option<String>,
247 #[serde(default)]
248 pub features: Option<Vec<String>>,
249 #[serde(default)]
252 pub serde_rename_all: Option<String>,
253}
254
255#[derive(Debug, Clone, Serialize, Deserialize)]
256pub struct RConfig {
257 pub package_name: Option<String>,
258 #[serde(default)]
259 pub features: Option<Vec<String>>,
260 #[serde(default)]
263 pub serde_rename_all: Option<String>,
264}
265
266#[derive(Debug, Clone, Default, Serialize, Deserialize)]
269pub struct CustomModulesConfig {
270 #[serde(default)]
271 pub python: Vec<String>,
272 #[serde(default)]
273 pub node: Vec<String>,
274 #[serde(default)]
275 pub ruby: Vec<String>,
276 #[serde(default)]
277 pub php: Vec<String>,
278 #[serde(default)]
279 pub elixir: Vec<String>,
280 #[serde(default)]
281 pub wasm: Vec<String>,
282 #[serde(default)]
283 pub ffi: Vec<String>,
284 #[serde(default)]
285 pub go: Vec<String>,
286 #[serde(default)]
287 pub java: Vec<String>,
288 #[serde(default)]
289 pub csharp: Vec<String>,
290 #[serde(default)]
291 pub r: Vec<String>,
292}
293
294impl CustomModulesConfig {
295 pub fn for_language(&self, lang: Language) -> &[String] {
296 match lang {
297 Language::Python => &self.python,
298 Language::Node => &self.node,
299 Language::Ruby => &self.ruby,
300 Language::Php => &self.php,
301 Language::Elixir => &self.elixir,
302 Language::Wasm => &self.wasm,
303 Language::Ffi => &self.ffi,
304 Language::Go => &self.go,
305 Language::Java => &self.java,
306 Language::Csharp => &self.csharp,
307 Language::R => &self.r,
308 Language::Rust => &[], }
310 }
311}
312
313#[derive(Debug, Clone, Default, Serialize, Deserialize)]
315pub struct CustomRegistration {
316 #[serde(default)]
317 pub classes: Vec<String>,
318 #[serde(default)]
319 pub functions: Vec<String>,
320 #[serde(default)]
321 pub init_calls: Vec<String>,
322}
323
324#[derive(Debug, Clone, Default, Serialize, Deserialize)]
326pub struct CustomRegistrationsConfig {
327 #[serde(default)]
328 pub python: Option<CustomRegistration>,
329 #[serde(default)]
330 pub node: Option<CustomRegistration>,
331 #[serde(default)]
332 pub ruby: Option<CustomRegistration>,
333 #[serde(default)]
334 pub php: Option<CustomRegistration>,
335 #[serde(default)]
336 pub elixir: Option<CustomRegistration>,
337 #[serde(default)]
338 pub wasm: Option<CustomRegistration>,
339}
340
341impl CustomRegistrationsConfig {
342 pub fn for_language(&self, lang: Language) -> Option<&CustomRegistration> {
343 match lang {
344 Language::Python => self.python.as_ref(),
345 Language::Node => self.node.as_ref(),
346 Language::Ruby => self.ruby.as_ref(),
347 Language::Php => self.php.as_ref(),
348 Language::Elixir => self.elixir.as_ref(),
349 Language::Wasm => self.wasm.as_ref(),
350 _ => None,
351 }
352 }
353}