Skip to main content

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