Skip to main content

alef_core/config/
languages.rs

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    /// Feature gate for ext-php-rs (default: "extension-module").
34    /// All generated code is wrapped in `#[cfg(feature = "...")]`.
35    #[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    /// Native library name for Go cgo/Java Panama/C# P/Invoke (e.g., "ts_pack_ffi").
61    /// Defaults to `{prefix}_ffi`.
62    #[serde(default)]
63    pub lib_name: Option<String>,
64    /// If true, generate visitor/callback FFI support:
65    /// a `#[repr(C)]` callbacks struct, an opaque `Visitor` handle that implements
66    /// the core visitor trait by calling the C function pointers, and
67    /// `{prefix}_visitor_create` / `{prefix}_visitor_free` /
68    /// `{prefix}_convert_with_visitor` exports.
69    #[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    /// Override the Go package name (default: derived from module path)
81    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/// Custom modules that alef should declare (mod X;) but not generate.
107/// These are hand-written modules imported by the generated lib.rs.
108#[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/// Custom classes/functions from hand-written modules to register in module init.
153#[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/// Per-language custom registrations.
164#[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}