espforge_lib/config/
mod.rs

1use 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}