Skip to main content

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