Skip to main content

bo4e_core/enums/
surcharge_target.rs

1//! Surcharge target (AufAbschlagsziel) enumeration.
2
3use serde::{Deserialize, Serialize};
4
5/// Target price for surcharge or discount.
6///
7/// The price to which a surcharge or discount applies.
8///
9/// German: AufAbschlagsziel
10#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
11#[cfg_attr(feature = "json-schema", derive(schemars::JsonSchema))]
12#[cfg_attr(feature = "json-schema", schemars(rename = "AufAbschlagsziel"))]
13#[non_exhaustive]
14pub enum SurchargeTarget {
15    /// Working price single tariff (Arbeitspreis Eintarif)
16    #[serde(rename = "ARBEITSPREIS_EINTARIF")]
17    WorkingPriceSingleTariff,
18
19    /// Working price high tariff (Arbeitspreis HT)
20    #[serde(rename = "ARBEITSPREIS_HT")]
21    WorkingPriceHT,
22
23    /// Working price low tariff (Arbeitspreis NT)
24    #[serde(rename = "ARBEITSPREIS_NT")]
25    WorkingPriceNT,
26
27    /// Working price HT and NT combined (Arbeitspreis HT und NT)
28    #[serde(rename = "ARBEITSPREIS_HT_NT")]
29    WorkingPriceHTNT,
30
31    /// Base price (Grundpreis)
32    #[serde(rename = "GRUNDPREIS")]
33    BasePrice,
34
35    /// Total price (Gesamtpreis)
36    #[serde(rename = "GESAMTPREIS")]
37    TotalPrice,
38}
39
40impl SurchargeTarget {
41    /// Returns the German name.
42    pub fn german_name(&self) -> &'static str {
43        match self {
44            Self::WorkingPriceSingleTariff => "Auf-/Abschlag auf den Arbeitspreis Eintarif",
45            Self::WorkingPriceHT => "Auf-/Abschlag auf den Arbeitspreis HT",
46            Self::WorkingPriceNT => "Auf-/Abschlag auf den Arbeitspreis NT",
47            Self::WorkingPriceHTNT => "Auf-/Abschlag auf den Arbeitspreis HT und NT",
48            Self::BasePrice => "Auf-/Abschlag auf den Grundpreis",
49            Self::TotalPrice => "Auf-/Abschlag auf den Gesamtpreis",
50        }
51    }
52}
53
54#[cfg(test)]
55mod tests {
56    use super::*;
57
58    #[test]
59    fn test_serialize() {
60        assert_eq!(
61            serde_json::to_string(&SurchargeTarget::BasePrice).unwrap(),
62            r#""GRUNDPREIS""#
63        );
64        assert_eq!(
65            serde_json::to_string(&SurchargeTarget::TotalPrice).unwrap(),
66            r#""GESAMTPREIS""#
67        );
68    }
69
70    #[test]
71    fn test_roundtrip() {
72        for target in [
73            SurchargeTarget::WorkingPriceSingleTariff,
74            SurchargeTarget::WorkingPriceHT,
75            SurchargeTarget::WorkingPriceNT,
76            SurchargeTarget::WorkingPriceHTNT,
77            SurchargeTarget::BasePrice,
78            SurchargeTarget::TotalPrice,
79        ] {
80            let json = serde_json::to_string(&target).unwrap();
81            let parsed: SurchargeTarget = serde_json::from_str(&json).unwrap();
82            assert_eq!(target, parsed);
83        }
84    }
85}