Skip to main content

bo4e_core/enums/
time_unit.rs

1//! Time unit (Zeiteinheit) enumeration.
2
3use serde::{Deserialize, Serialize};
4
5/// Unit of time.
6///
7/// Time periods used for measurements, billing, or contracts.
8///
9/// German: Zeiteinheit
10#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
11#[cfg_attr(feature = "json-schema", derive(schemars::JsonSchema))]
12#[cfg_attr(feature = "json-schema", schemars(rename = "Zeiteinheit"))]
13#[non_exhaustive]
14pub enum TimeUnit {
15    /// Second
16    #[serde(rename = "SEKUNDE")]
17    Second,
18
19    /// Minute
20    #[serde(rename = "MINUTE")]
21    Minute,
22
23    /// Hour
24    #[serde(rename = "STUNDE")]
25    Hour,
26
27    /// Quarter hour (15 minutes)
28    #[serde(rename = "VIERTEL_STUNDE")]
29    QuarterHour,
30
31    /// Day
32    #[serde(rename = "TAG")]
33    Day,
34
35    /// Week
36    #[serde(rename = "WOCHE")]
37    Week,
38
39    /// Month
40    #[serde(rename = "MONAT")]
41    Month,
42
43    /// Quarter (3 months)
44    #[serde(rename = "QUARTAL")]
45    Quarter,
46
47    /// Half year (6 months)
48    #[serde(rename = "HALBJAHR")]
49    HalfYear,
50
51    /// Year
52    #[serde(rename = "JAHR")]
53    Year,
54}
55
56impl TimeUnit {
57    /// Returns the German name.
58    pub fn german_name(&self) -> &'static str {
59        match self {
60            Self::Second => "Sekunde",
61            Self::Minute => "Minute",
62            Self::Hour => "Stunde",
63            Self::QuarterHour => "Viertelstunde",
64            Self::Day => "Tag",
65            Self::Week => "Woche",
66            Self::Month => "Monat",
67            Self::Quarter => "Quartal",
68            Self::HalfYear => "Halbjahr",
69            Self::Year => "Jahr",
70        }
71    }
72}
73
74#[cfg(test)]
75mod tests {
76    use super::*;
77
78    #[test]
79    fn test_serialize() {
80        assert_eq!(
81            serde_json::to_string(&TimeUnit::Hour).unwrap(),
82            r#""STUNDE""#
83        );
84        assert_eq!(serde_json::to_string(&TimeUnit::Year).unwrap(), r#""JAHR""#);
85    }
86
87    #[test]
88    fn test_roundtrip() {
89        for unit in [
90            TimeUnit::Second,
91            TimeUnit::Minute,
92            TimeUnit::Hour,
93            TimeUnit::QuarterHour,
94            TimeUnit::Day,
95            TimeUnit::Week,
96            TimeUnit::Month,
97            TimeUnit::Quarter,
98            TimeUnit::HalfYear,
99            TimeUnit::Year,
100        ] {
101            let json = serde_json::to_string(&unit).unwrap();
102            let parsed: TimeUnit = serde_json::from_str(&json).unwrap();
103            assert_eq!(unit, parsed);
104        }
105    }
106}