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}
13
14#[derive(Debug, Clone, Serialize, Deserialize)]
15pub struct StubsConfig {
16 pub output: PathBuf,
17}
18
19#[derive(Debug, Clone, Serialize, Deserialize)]
20pub struct NodeConfig {
21 pub package_name: Option<String>,
22}
23
24#[derive(Debug, Clone, Serialize, Deserialize)]
25pub struct RubyConfig {
26 pub gem_name: Option<String>,
27 pub stubs: Option<StubsConfig>,
28}
29
30#[derive(Debug, Clone, Serialize, Deserialize)]
31pub struct PhpConfig {
32 pub extension_name: Option<String>,
33 #[serde(default)]
36 pub feature_gate: Option<String>,
37}
38
39#[derive(Debug, Clone, Serialize, Deserialize)]
40pub struct ElixirConfig {
41 pub app_name: Option<String>,
42}
43
44#[derive(Debug, Clone, Serialize, Deserialize)]
45pub struct WasmConfig {
46 #[serde(default)]
47 pub exclude_functions: Vec<String>,
48 #[serde(default)]
49 pub exclude_types: Vec<String>,
50 #[serde(default)]
51 pub type_overrides: HashMap<String, String>,
52}
53
54#[derive(Debug, Clone, Serialize, Deserialize)]
55pub struct FfiConfig {
56 pub prefix: Option<String>,
57 #[serde(default = "default_error_style")]
58 pub error_style: String,
59 pub header_name: Option<String>,
60 #[serde(default)]
63 pub lib_name: Option<String>,
64 #[serde(default)]
70 pub visitor_callbacks: bool,
71}
72
73fn default_error_style() -> String {
74 "last_error".to_string()
75}
76
77#[derive(Debug, Clone, Serialize, Deserialize)]
78pub struct GoConfig {
79 pub module: Option<String>,
80 pub package_name: Option<String>,
82}
83
84#[derive(Debug, Clone, Serialize, Deserialize)]
85pub struct JavaConfig {
86 pub package: Option<String>,
87 #[serde(default = "default_java_ffi_style")]
88 pub ffi_style: String,
89}
90
91fn default_java_ffi_style() -> String {
92 "panama".to_string()
93}
94
95#[derive(Debug, Clone, Serialize, Deserialize)]
96pub struct CSharpConfig {
97 pub namespace: Option<String>,
98 pub target_framework: Option<String>,
99}
100
101#[derive(Debug, Clone, Serialize, Deserialize)]
102pub struct RConfig {
103 pub package_name: Option<String>,
104}
105
106#[derive(Debug, Clone, Default, Serialize, Deserialize)]
109pub struct CustomModulesConfig {
110 #[serde(default)]
111 pub python: Vec<String>,
112 #[serde(default)]
113 pub node: Vec<String>,
114 #[serde(default)]
115 pub ruby: Vec<String>,
116 #[serde(default)]
117 pub php: Vec<String>,
118 #[serde(default)]
119 pub elixir: Vec<String>,
120 #[serde(default)]
121 pub wasm: Vec<String>,
122 #[serde(default)]
123 pub ffi: Vec<String>,
124 #[serde(default)]
125 pub go: Vec<String>,
126 #[serde(default)]
127 pub java: Vec<String>,
128 #[serde(default)]
129 pub csharp: Vec<String>,
130 #[serde(default)]
131 pub r: Vec<String>,
132}
133
134impl CustomModulesConfig {
135 pub fn for_language(&self, lang: Language) -> &[String] {
136 match lang {
137 Language::Python => &self.python,
138 Language::Node => &self.node,
139 Language::Ruby => &self.ruby,
140 Language::Php => &self.php,
141 Language::Elixir => &self.elixir,
142 Language::Wasm => &self.wasm,
143 Language::Ffi => &self.ffi,
144 Language::Go => &self.go,
145 Language::Java => &self.java,
146 Language::Csharp => &self.csharp,
147 Language::R => &self.r,
148 }
149 }
150}
151
152#[derive(Debug, Clone, Default, Serialize, Deserialize)]
154pub struct CustomRegistration {
155 #[serde(default)]
156 pub classes: Vec<String>,
157 #[serde(default)]
158 pub functions: Vec<String>,
159 #[serde(default)]
160 pub init_calls: Vec<String>,
161}
162
163#[derive(Debug, Clone, Default, Serialize, Deserialize)]
165pub struct CustomRegistrationsConfig {
166 #[serde(default)]
167 pub python: Option<CustomRegistration>,
168 #[serde(default)]
169 pub node: Option<CustomRegistration>,
170 #[serde(default)]
171 pub ruby: Option<CustomRegistration>,
172 #[serde(default)]
173 pub php: Option<CustomRegistration>,
174 #[serde(default)]
175 pub elixir: Option<CustomRegistration>,
176 #[serde(default)]
177 pub wasm: Option<CustomRegistration>,
178}
179
180impl CustomRegistrationsConfig {
181 pub fn for_language(&self, lang: Language) -> Option<&CustomRegistration> {
182 match lang {
183 Language::Python => self.python.as_ref(),
184 Language::Node => self.node.as_ref(),
185 Language::Ruby => self.ruby.as_ref(),
186 Language::Php => self.php.as_ref(),
187 Language::Elixir => self.elixir.as_ref(),
188 Language::Wasm => self.wasm.as_ref(),
189 _ => None,
190 }
191 }
192}