1use serde::{Deserialize, Serialize};
4
5#[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}