ecad_processor/archive/
mod.rs1pub 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, Maximum, Average, }
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}