ecad_processor/archive/
mod.rs

1pub mod inspector;
2pub mod multi_processor;
3pub mod processor;
4pub mod temp_manager;
5
6pub use inspector::{ArchiveInspector, ArchiveMetadata};
7pub use multi_processor::{ArchiveInfo, MultiArchiveProcessor};
8pub use processor::ArchiveProcessor;
9pub use temp_manager::TempFileManager;
10
11use serde::{Deserialize, Serialize};
12
13#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
14pub enum WeatherMetric {
15    Temperature(TemperatureType),
16    Precipitation,
17    WindSpeed,
18}
19
20#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
21pub enum TemperatureType {
22    Minimum, // TN
23    Maximum, // TX
24    Average, // TG
25}
26
27impl WeatherMetric {
28    pub fn from_file_prefix(prefix: &str) -> Option<Self> {
29        match prefix {
30            "TN" => Some(WeatherMetric::Temperature(TemperatureType::Minimum)),
31            "TX" => Some(WeatherMetric::Temperature(TemperatureType::Maximum)),
32            "TG" => Some(WeatherMetric::Temperature(TemperatureType::Average)),
33            "RR" => Some(WeatherMetric::Precipitation),
34            "FG" => Some(WeatherMetric::WindSpeed),
35            _ => None,
36        }
37    }
38
39    pub fn to_file_prefix(&self) -> &'static str {
40        match self {
41            WeatherMetric::Temperature(TemperatureType::Minimum) => "TN",
42            WeatherMetric::Temperature(TemperatureType::Maximum) => "TX",
43            WeatherMetric::Temperature(TemperatureType::Average) => "TG",
44            WeatherMetric::Precipitation => "RR",
45            WeatherMetric::WindSpeed => "FG",
46        }
47    }
48
49    pub fn display_name(&self) -> &'static str {
50        match self {
51            WeatherMetric::Temperature(TemperatureType::Minimum) => "Temperature (Min)",
52            WeatherMetric::Temperature(TemperatureType::Maximum) => "Temperature (Max)",
53            WeatherMetric::Temperature(TemperatureType::Average) => "Temperature (Avg)",
54            WeatherMetric::Precipitation => "Precipitation",
55            WeatherMetric::WindSpeed => "Wind Speed",
56        }
57    }
58
59    pub fn units(&self) -> &'static str {
60        match self {
61            WeatherMetric::Temperature(_) => "0.1°C",
62            WeatherMetric::Precipitation => "0.1mm",
63            WeatherMetric::WindSpeed => "0.1 m/s",
64        }
65    }
66}
67
68impl std::fmt::Display for WeatherMetric {
69    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
70        write!(f, "{}", self.display_name())
71    }
72}
73
74#[cfg(test)]
75mod tests {
76    use super::*;
77
78    #[test]
79    fn test_weather_metric_from_prefix() {
80        assert_eq!(
81            WeatherMetric::from_file_prefix("TN"),
82            Some(WeatherMetric::Temperature(TemperatureType::Minimum))
83        );
84        assert_eq!(
85            WeatherMetric::from_file_prefix("TX"),
86            Some(WeatherMetric::Temperature(TemperatureType::Maximum))
87        );
88        assert_eq!(
89            WeatherMetric::from_file_prefix("TG"),
90            Some(WeatherMetric::Temperature(TemperatureType::Average))
91        );
92        assert_eq!(
93            WeatherMetric::from_file_prefix("RR"),
94            Some(WeatherMetric::Precipitation)
95        );
96        assert_eq!(
97            WeatherMetric::from_file_prefix("FG"),
98            Some(WeatherMetric::WindSpeed)
99        );
100        assert_eq!(WeatherMetric::from_file_prefix("XX"), None);
101    }
102
103    #[test]
104    fn test_weather_metric_to_prefix() {
105        assert_eq!(
106            WeatherMetric::Temperature(TemperatureType::Minimum).to_file_prefix(),
107            "TN"
108        );
109        assert_eq!(
110            WeatherMetric::Temperature(TemperatureType::Maximum).to_file_prefix(),
111            "TX"
112        );
113        assert_eq!(
114            WeatherMetric::Temperature(TemperatureType::Average).to_file_prefix(),
115            "TG"
116        );
117        assert_eq!(WeatherMetric::Precipitation.to_file_prefix(), "RR");
118        assert_eq!(WeatherMetric::WindSpeed.to_file_prefix(), "FG");
119    }
120
121    #[test]
122    fn test_weather_metric_display() {
123        assert_eq!(
124            WeatherMetric::Temperature(TemperatureType::Minimum).display_name(),
125            "Temperature (Min)"
126        );
127        assert_eq!(WeatherMetric::Precipitation.display_name(), "Precipitation");
128        assert_eq!(WeatherMetric::WindSpeed.display_name(), "Wind Speed");
129    }
130
131    #[test]
132    fn test_weather_metric_units() {
133        assert_eq!(
134            WeatherMetric::Temperature(TemperatureType::Minimum).units(),
135            "0.1°C"
136        );
137        assert_eq!(WeatherMetric::Precipitation.units(), "0.1mm");
138        assert_eq!(WeatherMetric::WindSpeed.units(), "0.1 m/s");
139    }
140}