use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::path::PathBuf;
use super::dto::JavaDtoConfig;
use super::extras::Language;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(untagged)]
pub enum CapsuleTypeConfig {
Capsule(String),
ConstructFrom {
python_type: String,
construct_from: String,
},
}
impl CapsuleTypeConfig {
pub fn python_type(&self) -> &str {
match self {
Self::Capsule(name) => name,
Self::ConstructFrom { python_type, .. } => python_type,
}
}
pub fn construct_from(&self) -> Option<&str> {
match self {
Self::ConstructFrom { construct_from, .. } => Some(construct_from.as_str()),
Self::Capsule(_) => None,
}
}
pub fn is_capsule_roundtrip(&self) -> bool {
matches!(self, Self::Capsule(_))
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PythonConfig {
pub module_name: Option<String>,
pub async_runtime: Option<String>,
pub stubs: Option<StubsConfig>,
#[serde(default)]
pub pip_name: Option<String>,
#[serde(default)]
pub features: Option<Vec<String>>,
#[serde(default)]
pub serde_rename_all: Option<String>,
#[serde(default)]
pub capsule_types: HashMap<String, CapsuleTypeConfig>,
#[serde(default)]
pub release_gil: bool,
#[serde(default)]
pub exclude_functions: Vec<String>,
#[serde(default)]
pub exclude_types: Vec<String>,
#[serde(default)]
pub extra_dependencies: HashMap<String, toml::Value>,
#[serde(default)]
pub pip_dependencies: Vec<String>,
#[serde(default)]
pub scaffold_output: Option<PathBuf>,
#[serde(default)]
pub rename_fields: HashMap<String, String>,
#[serde(default)]
pub run_wrapper: Option<String>,
#[serde(default)]
pub extra_lint_paths: Vec<String>,
#[serde(default)]
pub extra_init_imports: std::collections::BTreeMap<String, Vec<String>>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct StubsConfig {
pub output: PathBuf,
#[serde(default)]
pub emit_docstrings: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct NodeCapsuleTypeConfig {
#[serde(rename = "type")]
pub type_name: String,
pub from_module: String,
#[serde(default = "default_node_capsule_construct")]
pub construct: String,
#[serde(default = "default_node_capsule_property_name")]
pub property_name: String,
#[serde(default)]
pub type_tag: Option<NapiTypeTagConfig>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct NapiTypeTagConfig {
pub lower: String,
pub upper: String,
}
fn default_node_capsule_construct() -> String {
"external_pointer".to_string()
}
fn default_node_capsule_property_name() -> String {
"__parser".to_string()
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NodeConfig {
pub package_name: Option<String>,
#[serde(default)]
pub features: Option<Vec<String>>,
#[serde(default)]
pub serde_rename_all: Option<String>,
#[serde(default)]
pub type_prefix: Option<String>,
#[serde(default)]
pub capsule_types: HashMap<String, NodeCapsuleTypeConfig>,
#[serde(default)]
pub exclude_functions: Vec<String>,
#[serde(default)]
pub exclude_types: Vec<String>,
#[serde(default)]
pub extra_dependencies: HashMap<String, toml::Value>,
#[serde(default)]
pub scaffold_output: Option<PathBuf>,
#[serde(default)]
pub rename_fields: HashMap<String, String>,
#[serde(default)]
pub run_wrapper: Option<String>,
#[serde(default)]
pub extra_lint_paths: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RubyConfig {
pub gem_name: Option<String>,
pub stubs: Option<StubsConfig>,
#[serde(default)]
pub features: Option<Vec<String>>,
#[serde(default)]
pub serde_rename_all: Option<String>,
#[serde(default)]
pub exclude_functions: Vec<String>,
#[serde(default)]
pub exclude_types: Vec<String>,
#[serde(default)]
pub extra_dependencies: HashMap<String, toml::Value>,
#[serde(default)]
pub scaffold_output: Option<PathBuf>,
#[serde(default)]
pub rename_fields: HashMap<String, String>,
#[serde(default)]
pub run_wrapper: Option<String>,
#[serde(default)]
pub extra_lint_paths: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PhpConfig {
pub extension_name: Option<String>,
#[serde(default)]
pub cargo_crate_name: Option<String>,
#[serde(default)]
pub namespace: Option<String>,
#[serde(default)]
pub feature_gate: Option<String>,
#[serde(default)]
pub stubs: Option<StubsConfig>,
#[serde(default)]
pub features: Option<Vec<String>>,
#[serde(default)]
pub serde_rename_all: Option<String>,
#[serde(default)]
pub exclude_functions: Vec<String>,
#[serde(default)]
pub exclude_types: Vec<String>,
#[serde(default)]
pub extra_dependencies: HashMap<String, toml::Value>,
#[serde(default)]
pub scaffold_output: Option<PathBuf>,
#[serde(default)]
pub rename_fields: HashMap<String, String>,
#[serde(default)]
pub run_wrapper: Option<String>,
#[serde(default)]
pub extra_lint_paths: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ElixirConfig {
pub app_name: Option<String>,
#[serde(default)]
pub features: Option<Vec<String>>,
#[serde(default)]
pub serde_rename_all: Option<String>,
#[serde(default)]
pub exclude_functions: Vec<String>,
#[serde(default)]
pub exclude_types: Vec<String>,
#[serde(default)]
pub extra_dependencies: HashMap<String, toml::Value>,
#[serde(default)]
pub scaffold_output: Option<PathBuf>,
#[serde(default)]
pub rename_fields: HashMap<String, String>,
#[serde(default)]
pub run_wrapper: Option<String>,
#[serde(default)]
pub extra_lint_paths: Vec<String>,
#[serde(default)]
pub cpu_bound_functions: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WasmConfig {
#[serde(default)]
pub exclude_functions: Vec<String>,
#[serde(default)]
pub exclude_types: Vec<String>,
#[serde(default)]
pub type_overrides: HashMap<String, String>,
#[serde(default)]
pub features: Option<Vec<String>>,
#[serde(default)]
pub serde_rename_all: Option<String>,
#[serde(default)]
pub type_prefix: Option<String>,
#[serde(default)]
pub env_shims: Vec<String>,
#[serde(default)]
pub extra_dependencies: HashMap<String, toml::Value>,
#[serde(default)]
pub rename_fields: HashMap<String, String>,
#[serde(default)]
pub run_wrapper: Option<String>,
#[serde(default)]
pub extra_lint_paths: Vec<String>,
#[serde(default)]
pub core_crate_override: Option<String>,
#[serde(default)]
pub exclude_extra_dependencies: Vec<String>,
#[serde(default)]
pub custom_rust_modules: Vec<String>,
#[serde(default)]
pub exclude_fields: HashMap<String, Vec<String>>,
#[serde(default)]
pub source_crate_remaps: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FfiConfig {
pub prefix: Option<String>,
#[serde(default = "default_error_style")]
pub error_style: String,
pub header_name: Option<String>,
#[serde(default)]
pub lib_name: Option<String>,
#[serde(default)]
pub visitor_callbacks: bool,
#[serde(default)]
pub features: Option<Vec<String>>,
#[serde(default)]
pub serde_rename_all: Option<String>,
#[serde(default)]
pub exclude_functions: Vec<String>,
#[serde(default)]
pub exclude_types: Vec<String>,
#[serde(default)]
pub rename_fields: HashMap<String, String>,
#[serde(default)]
pub plugin_error_constructor: Option<String>,
}
fn default_error_style() -> String {
"last_error".to_string()
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GoConfig {
pub module: Option<String>,
pub package_name: Option<String>,
#[serde(default)]
pub features: Option<Vec<String>>,
#[serde(default)]
pub exclude_types: Vec<String>,
#[serde(default)]
pub serde_rename_all: Option<String>,
#[serde(default)]
pub rename_fields: HashMap<String, String>,
#[serde(default)]
pub run_wrapper: Option<String>,
#[serde(default)]
pub extra_lint_paths: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct JavaConfig {
pub package: Option<String>,
#[serde(default)]
pub group_id: Option<String>,
#[serde(default)]
pub artifact_id: Option<String>,
#[serde(default = "default_java_ffi_style")]
pub ffi_style: String,
#[serde(default)]
pub features: Option<Vec<String>>,
#[serde(default)]
pub exclude_types: Vec<String>,
#[serde(default)]
pub serde_rename_all: Option<String>,
#[serde(default)]
pub rename_fields: HashMap<String, String>,
#[serde(default)]
pub run_wrapper: Option<String>,
#[serde(default)]
pub extra_lint_paths: Vec<String>,
#[serde(default)]
pub project_file: Option<String>,
#[serde(default)]
pub dto: JavaDtoConfig,
}
fn default_java_ffi_style() -> String {
"panama".to_string()
}
#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum KotlinFfiStyle {
#[default]
Panama,
Jni,
}
#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum KotlinTarget {
#[default]
Jvm,
Native,
Multiplatform,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct KotlinConfig {
pub package: Option<String>,
#[serde(default)]
pub features: Option<Vec<String>>,
#[serde(default)]
pub serde_rename_all: Option<String>,
#[serde(default)]
pub rename_fields: HashMap<String, String>,
#[serde(default)]
pub exclude_functions: Vec<String>,
#[serde(default)]
pub exclude_types: Vec<String>,
#[serde(default)]
pub run_wrapper: Option<String>,
#[serde(default)]
pub extra_lint_paths: Vec<String>,
#[serde(default)]
pub target: KotlinTarget,
#[serde(default)]
pub mode: Option<String>,
#[serde(default)]
pub ffi_style: KotlinFfiStyle,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct KotlinAndroidConfig {
#[serde(default)]
pub package: Option<String>,
#[serde(default)]
pub namespace: Option<String>,
#[serde(default)]
pub artifact_id: Option<String>,
#[serde(default)]
pub group_id: Option<String>,
#[serde(default)]
pub compile_sdk: Option<u32>,
#[serde(default)]
pub min_sdk: Option<u32>,
#[serde(default)]
pub jvm_target: Option<String>,
#[serde(default)]
pub abis: Option<Vec<String>>,
#[serde(default)]
pub serde_rename_all: Option<String>,
#[serde(default)]
pub rename_fields: HashMap<String, String>,
#[serde(default)]
pub exclude_functions: Vec<String>,
#[serde(default)]
pub exclude_types: Vec<String>,
#[serde(default)]
pub run_wrapper: Option<String>,
#[serde(default)]
pub extra_lint_paths: Vec<String>,
#[serde(default)]
pub features: Option<Vec<String>>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct JniConfig {}
#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum DartStyle {
#[default]
Frb,
Ffi,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GleamConfig {
pub app_name: Option<String>,
#[serde(default)]
pub nif_module: Option<String>,
#[serde(default)]
pub features: Option<Vec<String>>,
#[serde(default)]
pub serde_rename_all: Option<String>,
#[serde(default)]
pub rename_fields: HashMap<String, String>,
#[serde(default)]
pub exclude_functions: Vec<String>,
#[serde(default)]
pub exclude_types: Vec<String>,
#[serde(default)]
pub run_wrapper: Option<String>,
#[serde(default)]
pub extra_lint_paths: Vec<String>,
#[serde(default)]
pub element_constructors: Vec<GleamElementConstructor>,
#[serde(default)]
pub json_object_wrapper: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GleamElementConstructor {
pub element_type: String,
pub constructor: String,
pub fields: Vec<GleamElementField>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GleamElementField {
pub gleam_field: String,
pub kind: String,
#[serde(default)]
pub json_field: Option<String>,
#[serde(default)]
pub default: Option<String>,
#[serde(default)]
pub value: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct DartConfig {
#[serde(default)]
pub pubspec_name: Option<String>,
#[serde(default)]
pub lib_name: Option<String>,
#[serde(default)]
pub package_name: Option<String>,
#[serde(default)]
pub style: DartStyle,
#[serde(default)]
pub frb_version: Option<String>,
#[serde(default)]
pub features: Option<Vec<String>>,
#[serde(default)]
pub extra_dependencies: HashMap<String, toml::Value>,
#[serde(default)]
pub serde_rename_all: Option<String>,
#[serde(default)]
pub rename_fields: HashMap<String, String>,
#[serde(default)]
pub exclude_functions: Vec<String>,
#[serde(default)]
pub exclude_types: Vec<String>,
#[serde(default)]
pub run_wrapper: Option<String>,
#[serde(default)]
pub extra_lint_paths: Vec<String>,
#[serde(default)]
pub core_crate_override: Option<String>,
#[serde(default)]
pub exclude_extra_dependencies: Vec<String>,
#[serde(default)]
pub stub_methods: Vec<String>,
#[serde(default)]
pub target_dep_overrides: Vec<DartTargetDepOverride>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DartTargetDepOverride {
pub cfg: String,
#[serde(default)]
pub features: Vec<String>,
#[serde(default)]
pub default_features: bool,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct SwiftConfig {
#[serde(default)]
pub module_name: Option<String>,
#[serde(default)]
pub package_name: Option<String>,
#[serde(default)]
pub swift_bridge_version: Option<String>,
#[serde(default)]
pub min_macos_version: Option<String>,
#[serde(default)]
pub min_ios_version: Option<String>,
#[serde(default)]
pub features: Option<Vec<String>>,
#[serde(default)]
pub serde_rename_all: Option<String>,
#[serde(default)]
pub rename_fields: HashMap<String, String>,
#[serde(default)]
pub exclude_functions: Vec<String>,
#[serde(default)]
pub exclude_types: Vec<String>,
#[serde(default)]
pub exclude_fields: Vec<String>,
#[serde(default)]
pub run_wrapper: Option<String>,
#[serde(default)]
pub extra_lint_paths: Vec<String>,
#[serde(default)]
pub core_crate_override: Option<String>,
#[serde(default)]
pub extra_dependencies: HashMap<String, toml::Value>,
#[serde(default)]
pub exclude_extra_dependencies: Vec<String>,
#[serde(default)]
pub client_constructor_body: HashMap<String, String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ZigConfig {
pub module_name: Option<String>,
#[serde(default)]
pub features: Option<Vec<String>>,
#[serde(default)]
pub serde_rename_all: Option<String>,
#[serde(default)]
pub rename_fields: HashMap<String, String>,
#[serde(default)]
pub exclude_functions: Vec<String>,
#[serde(default)]
pub exclude_types: Vec<String>,
#[serde(default)]
pub run_wrapper: Option<String>,
#[serde(default)]
pub extra_lint_paths: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CSharpConfig {
pub namespace: Option<String>,
#[serde(default)]
pub package_id: Option<String>,
pub target_framework: Option<String>,
#[serde(default)]
pub features: Option<Vec<String>>,
#[serde(default)]
pub serde_rename_all: Option<String>,
#[serde(default)]
pub rename_fields: HashMap<String, String>,
#[serde(default)]
pub run_wrapper: Option<String>,
#[serde(default)]
pub extra_lint_paths: Vec<String>,
#[serde(default)]
pub project_file: Option<String>,
#[serde(default)]
pub exclude_types: Vec<String>,
#[serde(default)]
pub exclude_functions: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RConfig {
pub package_name: Option<String>,
#[serde(default)]
pub features: Option<Vec<String>>,
#[serde(default)]
pub serde_rename_all: Option<String>,
#[serde(default)]
pub rename_fields: HashMap<String, String>,
#[serde(default)]
pub run_wrapper: Option<String>,
#[serde(default)]
pub extra_lint_paths: Vec<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct CustomModulesConfig {
#[serde(default)]
pub python: Vec<String>,
#[serde(default)]
pub node: Vec<String>,
#[serde(default)]
pub ruby: Vec<String>,
#[serde(default)]
pub php: Vec<String>,
#[serde(default)]
pub elixir: Vec<String>,
#[serde(default)]
pub wasm: Vec<String>,
#[serde(default)]
pub ffi: Vec<String>,
#[serde(default)]
pub go: Vec<String>,
#[serde(default)]
pub java: Vec<String>,
#[serde(default)]
pub csharp: Vec<String>,
#[serde(default)]
pub r: Vec<String>,
}
impl CustomModulesConfig {
pub fn for_language(&self, lang: Language) -> &[String] {
match lang {
Language::Python => &self.python,
Language::Node => &self.node,
Language::Ruby => &self.ruby,
Language::Php => &self.php,
Language::Elixir => &self.elixir,
Language::Wasm => &self.wasm,
Language::Ffi => &self.ffi,
Language::Go => &self.go,
Language::Java => &self.java,
Language::Csharp => &self.csharp,
Language::R => &self.r,
Language::Rust => &[], Language::Kotlin
| Language::KotlinAndroid
| Language::Swift
| Language::Dart
| Language::Gleam
| Language::Zig
| Language::Jni
| Language::C => &[],
}
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct CustomRegistration {
#[serde(default)]
pub classes: Vec<String>,
#[serde(default)]
pub functions: Vec<String>,
#[serde(default)]
pub init_calls: Vec<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct CustomRegistrationsConfig {
#[serde(default)]
pub python: Option<CustomRegistration>,
#[serde(default)]
pub node: Option<CustomRegistration>,
#[serde(default)]
pub ruby: Option<CustomRegistration>,
#[serde(default)]
pub php: Option<CustomRegistration>,
#[serde(default)]
pub elixir: Option<CustomRegistration>,
#[serde(default)]
pub wasm: Option<CustomRegistration>,
}
impl CustomRegistrationsConfig {
pub fn for_language(&self, lang: Language) -> Option<&CustomRegistration> {
match lang {
Language::Python => self.python.as_ref(),
Language::Node => self.node.as_ref(),
Language::Ruby => self.ruby.as_ref(),
Language::Php => self.php.as_ref(),
Language::Elixir => self.elixir.as_ref(),
Language::Wasm => self.wasm.as_ref(),
_ => None,
}
}
}