bo4e_core/enums/
offer_status.rs

1//! Offer status (Angebotsstatus) enumeration.
2
3use serde::{Deserialize, Serialize};
4
5/// Status of an offer.
6///
7/// German: Angebotsstatus
8#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
9#[non_exhaustive]
10pub enum OfferStatus {
11    /// Concept phase (Konzeption)
12    #[serde(rename = "KONZEPTION")]
13    Concept,
14
15    /// Non-binding (Unverbindlich)
16    #[serde(rename = "UNVERBINDLICH")]
17    NonBinding,
18
19    /// Binding (Verbindlich)
20    #[serde(rename = "VERBINDLICH")]
21    Binding,
22
23    /// Commissioned/ordered (Beauftragt)
24    #[serde(rename = "BEAUFTRAGT")]
25    Commissioned,
26
27    /// Invalid (Ungueltig)
28    #[serde(rename = "UNGUELTIG")]
29    Invalid,
30
31    /// Rejected (Abgelehnt)
32    #[serde(rename = "ABGELEHNT")]
33    Rejected,
34
35    /// Followed up (Nachgefasst)
36    #[serde(rename = "NACHGEFASST")]
37    FollowedUp,
38
39    /// Pending (Ausstehend)
40    #[serde(rename = "AUSSTEHEND")]
41    Pending,
42
43    /// Completed (Erledigt)
44    #[serde(rename = "ERLEDIGT")]
45    Completed,
46}
47
48impl OfferStatus {
49    /// Returns the German name.
50    pub fn german_name(&self) -> &'static str {
51        match self {
52            Self::Concept => "Konzeption",
53            Self::NonBinding => "Unverbindlich",
54            Self::Binding => "Verbindlich",
55            Self::Commissioned => "Beauftragt",
56            Self::Invalid => "Ungueltig",
57            Self::Rejected => "Abgelehnt",
58            Self::FollowedUp => "Nachgefasst",
59            Self::Pending => "Ausstehend",
60            Self::Completed => "Erledigt",
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(&OfferStatus::Concept).unwrap(),
73            r#""KONZEPTION""#
74        );
75        assert_eq!(
76            serde_json::to_string(&OfferStatus::Binding).unwrap(),
77            r#""VERBINDLICH""#
78        );
79    }
80
81    #[test]
82    fn test_deserialize() {
83        assert_eq!(
84            serde_json::from_str::<OfferStatus>(r#""KONZEPTION""#).unwrap(),
85            OfferStatus::Concept
86        );
87        assert_eq!(
88            serde_json::from_str::<OfferStatus>(r#""ERLEDIGT""#).unwrap(),
89            OfferStatus::Completed
90        );
91    }
92
93    #[test]
94    fn test_roundtrip() {
95        for status in [
96            OfferStatus::Concept,
97            OfferStatus::NonBinding,
98            OfferStatus::Binding,
99            OfferStatus::Commissioned,
100            OfferStatus::Invalid,
101            OfferStatus::Rejected,
102            OfferStatus::FollowedUp,
103            OfferStatus::Pending,
104            OfferStatus::Completed,
105        ] {
106            let json = serde_json::to_string(&status).unwrap();
107            let parsed: OfferStatus = serde_json::from_str(&json).unwrap();
108            assert_eq!(status, parsed);
109        }
110    }
111}