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