Skip to main content

bo4e_core/enums/
tender_status.rs

1//! Tender status (Ausschreibungsstatus) enumeration.
2
3use serde::{Deserialize, Serialize};
4
5/// Status/phase of a tender process.
6///
7/// German: Ausschreibungsstatus
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 = "Ausschreibungsstatus"))]
11#[non_exhaustive]
12pub enum TenderStatus {
13    /// Phase 1: Participation competition (Teilnahmewettbewerb)
14    #[serde(rename = "PHASE1")]
15    Phase1,
16
17    /// Phase 2: Offer phase (Angebotsphase)
18    #[serde(rename = "PHASE2")]
19    Phase2,
20
21    /// Phase 3: Negotiation phase (Verhandlungsphase)
22    #[serde(rename = "PHASE3")]
23    Phase3,
24
25    /// Phase 4: Contract award (Zuschlagserteilung)
26    #[serde(rename = "PHASE4")]
27    Phase4,
28}
29
30impl TenderStatus {
31    /// Returns the German name.
32    pub fn german_name(&self) -> &'static str {
33        match self {
34            Self::Phase1 => "Teilnahmewettbewerb",
35            Self::Phase2 => "Angebotsphase",
36            Self::Phase3 => "Verhandlungsphase",
37            Self::Phase4 => "Zuschlagserteilung",
38        }
39    }
40}
41
42#[cfg(test)]
43mod tests {
44    use super::*;
45
46    #[test]
47    fn test_serialize() {
48        assert_eq!(
49            serde_json::to_string(&TenderStatus::Phase1).unwrap(),
50            r#""PHASE1""#
51        );
52        assert_eq!(
53            serde_json::to_string(&TenderStatus::Phase4).unwrap(),
54            r#""PHASE4""#
55        );
56    }
57
58    #[test]
59    fn test_deserialize() {
60        assert_eq!(
61            serde_json::from_str::<TenderStatus>(r#""PHASE1""#).unwrap(),
62            TenderStatus::Phase1
63        );
64        assert_eq!(
65            serde_json::from_str::<TenderStatus>(r#""PHASE3""#).unwrap(),
66            TenderStatus::Phase3
67        );
68    }
69
70    #[test]
71    fn test_roundtrip() {
72        for status in [
73            TenderStatus::Phase1,
74            TenderStatus::Phase2,
75            TenderStatus::Phase3,
76            TenderStatus::Phase4,
77        ] {
78            let json = serde_json::to_string(&status).unwrap();
79            let parsed: TenderStatus = serde_json::from_str(&json).unwrap();
80            assert_eq!(status, parsed);
81        }
82    }
83}