Skip to main content

weaveffi_core/
config.rs

1//! Per-target generator configuration.
2
3use serde::{Deserialize, Serialize};
4
5/// Configuration knobs that generators consult at code-generation time.
6///
7/// Every field falls back to a sensible default when `None`.
8#[derive(Debug, Clone, Default, Serialize, Deserialize)]
9pub struct GeneratorConfig {
10    pub swift_module_name: Option<String>,
11    pub android_package: Option<String>,
12    pub node_package_name: Option<String>,
13    pub wasm_module_name: Option<String>,
14    pub c_prefix: Option<String>,
15    #[serde(default)]
16    pub strip_module_prefix: bool,
17}
18
19impl GeneratorConfig {
20    pub fn swift_module_name(&self) -> &str {
21        self.swift_module_name.as_deref().unwrap_or("WeaveFFI")
22    }
23
24    pub fn android_package(&self) -> &str {
25        self.android_package.as_deref().unwrap_or("com.weaveffi")
26    }
27
28    pub fn node_package_name(&self) -> &str {
29        self.node_package_name.as_deref().unwrap_or("weaveffi")
30    }
31
32    pub fn wasm_module_name(&self) -> &str {
33        self.wasm_module_name.as_deref().unwrap_or("weaveffi_wasm")
34    }
35
36    pub fn c_prefix(&self) -> &str {
37        self.c_prefix.as_deref().unwrap_or("weaveffi")
38    }
39}
40
41#[cfg(test)]
42mod tests {
43    use super::*;
44
45    #[test]
46    fn defaults_are_applied() {
47        let cfg = GeneratorConfig::default();
48
49        assert_eq!(cfg.swift_module_name(), "WeaveFFI");
50        assert_eq!(cfg.android_package(), "com.weaveffi");
51        assert_eq!(cfg.node_package_name(), "weaveffi");
52        assert_eq!(cfg.wasm_module_name(), "weaveffi_wasm");
53        assert_eq!(cfg.c_prefix(), "weaveffi");
54        assert!(!cfg.strip_module_prefix);
55    }
56
57    #[test]
58    fn custom_values_override_defaults() {
59        let cfg = GeneratorConfig {
60            swift_module_name: Some("MySwift".into()),
61            android_package: Some("org.example".into()),
62            node_package_name: Some("my-node-pkg".into()),
63            wasm_module_name: Some("my_wasm".into()),
64            c_prefix: Some("myffi".into()),
65            strip_module_prefix: true,
66        };
67
68        assert_eq!(cfg.swift_module_name(), "MySwift");
69        assert_eq!(cfg.android_package(), "org.example");
70        assert_eq!(cfg.node_package_name(), "my-node-pkg");
71        assert_eq!(cfg.wasm_module_name(), "my_wasm");
72        assert_eq!(cfg.c_prefix(), "myffi");
73        assert!(cfg.strip_module_prefix);
74    }
75
76    #[test]
77    fn roundtrip_json() {
78        let cfg = GeneratorConfig {
79            swift_module_name: Some("S".into()),
80            android_package: None,
81            node_package_name: None,
82            wasm_module_name: None,
83            c_prefix: None,
84            strip_module_prefix: true,
85        };
86
87        let json = serde_json::to_string(&cfg).unwrap();
88        let back: GeneratorConfig = serde_json::from_str(&json).unwrap();
89
90        assert_eq!(back.swift_module_name(), "S");
91        assert_eq!(back.android_package(), "com.weaveffi");
92        assert!(back.strip_module_prefix);
93    }
94
95    #[test]
96    fn deserialize_empty_object_gives_defaults() {
97        let cfg: GeneratorConfig = serde_json::from_str("{}").unwrap();
98
99        assert_eq!(cfg.swift_module_name(), "WeaveFFI");
100        assert!(!cfg.strip_module_prefix);
101    }
102}