espforge_lib/config/
mod.rs1use std::collections::HashMap;
2use serde::{Deserialize, Serialize};
3
4pub mod app;
5pub mod components;
6pub mod devices;
7pub mod esp32;
8pub mod example;
9pub mod project;
10
11pub use app::*;
12pub use components::*;
13pub use devices::*;
14pub use esp32::*;
15pub use example::*;
16pub use project::*;
17
18#[derive(Debug, Deserialize, Serialize)]
19pub struct EspforgeConfiguration {
20 pub espforge: EspforgeConfig,
21 #[serde(default)]
22 pub example: Option<ExampleConfig>,
23 pub esp32: Option<Esp32Config>,
24 pub components: Option<HashMap<String, ComponentConfig>>,
25 pub devices: Option<HashMap<String, DeviceConfig>>,
26 pub app: Option<AppConfig>,
27}
28
29impl EspforgeConfiguration {
30 pub fn get_name(&self) -> &str {
31 &self.espforge.name
32 }
33
34 pub fn get_platform(&self) -> String {
35 self.espforge.platform.to_string()
36 }
37
38 pub fn get_template(&self) -> Option<String> {
39 self.example.as_ref().map(|e| e.name.clone())
40 }
41}
42
43#[cfg(test)]
44mod tests {
45 use super::*;
46 use serde_yaml_ng;
47
48 #[test]
49 fn parse_minimal() {
50 let yaml = r#"
51 espforge:
52 name: minimum
53 platform: esp32c3
54 "#;
55
56 let config: EspforgeConfiguration =
57 serde_yaml_ng::from_str(yaml).expect("YAML parse failed");
58
59 assert_eq!(config.espforge.name, "minimum");
60 assert_eq!(config.espforge.platform, PlatformConfig::ESP32C3);
61 assert!(config.example.is_none());
62 }
63
64 #[test]
65 fn parse_wokwi_config() {
66 let yaml = r#"
67 espforge:
68 name: wokwi_test
69 platform: esp32c3
70 wokwi:
71 diagram: diagram.json
72 config: wokwi.toml
73 "#;
74
75 let config: EspforgeConfiguration =
76 serde_yaml_ng::from_str(yaml).expect("YAML parse failed");
77
78 let wokwi = config.espforge.wokwi.expect("Wokwi config should exist");
79 assert_eq!(wokwi.diagram, Some("diagram.json".to_string()));
80 assert_eq!(wokwi.config, Some("wokwi.toml".to_string()));
81 }
82
83 #[test]
84 fn invalid_platform() {
85 let yaml = r#"
86 espforge:
87 name: minimum
88 platform: invalid
89 "#;
90
91 let result: Result<EspforgeConfiguration, _> = serde_yaml_ng::from_str(yaml);
92 assert!(
93 result.is_err(),
94 "expected invalid_platform to fail deserialization"
95 );
96 }
97
98 #[test]
99 fn parse_blink_example() {
100 let yaml = r#"
101 espforge:
102 name: blink
103 platform: esp32c3
104 example:
105 name: blink
106 "#;
107
108 let config: EspforgeConfiguration =
109 serde_yaml_ng::from_str(yaml).expect("YAML parse failed");
110
111 assert_eq!(config.espforge.name, "blink");
112 if let Some(example) = config.example {
113 assert_eq!(example.name, "blink");
114 } else {
115 panic!("Example was None.");
116 }
117 }
118}