bo4e_core/enums/
contract_status.rs

1//! Contract status (Vertragsstatus) enumeration.
2
3use serde::{Deserialize, Serialize};
4
5/// Status of a contract in its lifecycle.
6///
7/// German: Vertragsstatus
8#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
9#[non_exhaustive]
10pub enum ContractStatus {
11    /// In progress/draft (In Arbeit)
12    #[serde(rename = "IN_ARBEIT")]
13    InProgress,
14
15    /// Transmitted (Uebermittelt)
16    #[serde(rename = "UEBERMITTELT")]
17    Transmitted,
18
19    /// Accepted (Angenommen)
20    #[serde(rename = "ANGENOMMEN")]
21    Accepted,
22
23    /// Active (Aktiv)
24    #[serde(rename = "AKTIV")]
25    Active,
26
27    /// Rejected (Abgelehnt)
28    #[serde(rename = "ABGELEHNT")]
29    Rejected,
30
31    /// Revoked (Widerrufen)
32    #[serde(rename = "WIDERRUFEN")]
33    Revoked,
34
35    /// Cancelled (Storniert)
36    #[serde(rename = "STORNIERT")]
37    Cancelled,
38
39    /// Terminated (Gekuendigt)
40    #[serde(rename = "GEKUENDIGT")]
41    Terminated,
42
43    /// Ended (Beendet)
44    #[serde(rename = "BEENDET")]
45    Ended,
46}
47
48impl ContractStatus {
49    /// Returns the German name.
50    pub fn german_name(&self) -> &'static str {
51        match self {
52            Self::InProgress => "In Arbeit",
53            Self::Transmitted => "Uebermittelt",
54            Self::Accepted => "Angenommen",
55            Self::Active => "Aktiv",
56            Self::Rejected => "Abgelehnt",
57            Self::Revoked => "Widerrufen",
58            Self::Cancelled => "Storniert",
59            Self::Terminated => "Gekuendigt",
60            Self::Ended => "Beendet",
61        }
62    }
63}
64
65#[cfg(test)]
66mod tests {
67    use super::*;
68
69    #[test]
70    fn test_serialize() {
71        assert_eq!(
72            serde_json::to_string(&ContractStatus::Active).unwrap(),
73            r#""AKTIV""#
74        );
75        assert_eq!(
76            serde_json::to_string(&ContractStatus::Terminated).unwrap(),
77            r#""GEKUENDIGT""#
78        );
79    }
80
81    #[test]
82    fn test_deserialize() {
83        assert_eq!(
84            serde_json::from_str::<ContractStatus>(r#""IN_ARBEIT""#).unwrap(),
85            ContractStatus::InProgress
86        );
87        assert_eq!(
88            serde_json::from_str::<ContractStatus>(r#""BEENDET""#).unwrap(),
89            ContractStatus::Ended
90        );
91    }
92
93    #[test]
94    fn test_roundtrip() {
95        for status in [
96            ContractStatus::InProgress,
97            ContractStatus::Transmitted,
98            ContractStatus::Accepted,
99            ContractStatus::Active,
100            ContractStatus::Rejected,
101            ContractStatus::Revoked,
102            ContractStatus::Cancelled,
103            ContractStatus::Terminated,
104            ContractStatus::Ended,
105        ] {
106            let json = serde_json::to_string(&status).unwrap();
107            let parsed: ContractStatus = serde_json::from_str(&json).unwrap();
108            assert_eq!(status, parsed);
109        }
110    }
111}