bo4e_core/enums/
rounding_mode.rs

1//! Rounding mode (Rundungsverfahren) enumeration.
2
3use serde::{Deserialize, Serialize};
4
5/// Rounding mode/method.
6///
7/// Defines how numerical values should be rounded.
8///
9/// German: Rundungsverfahren
10#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
11#[non_exhaustive]
12pub enum RoundingMode {
13    /// No rounding (Keine Rundung)
14    #[serde(rename = "KEINE")]
15    None,
16
17    /// Commercial rounding / round half up (Kaufmännische Rundung)
18    #[serde(rename = "KAUFMAENNISCH")]
19    Commercial,
20
21    /// Round down / floor (Abrunden)
22    #[serde(rename = "ABRUNDEN")]
23    Floor,
24
25    /// Round up / ceiling (Aufrunden)
26    #[serde(rename = "AUFRUNDEN")]
27    Ceiling,
28}
29
30impl RoundingMode {
31    /// Returns the German name.
32    pub fn german_name(&self) -> &'static str {
33        match self {
34            Self::None => "Keine Rundung",
35            Self::Commercial => "Kaufmännische Rundung",
36            Self::Floor => "Abrunden",
37            Self::Ceiling => "Aufrunden",
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(&RoundingMode::Commercial).unwrap(),
50            r#""KAUFMAENNISCH""#
51        );
52    }
53
54    #[test]
55    fn test_roundtrip() {
56        for mode in [
57            RoundingMode::None,
58            RoundingMode::Commercial,
59            RoundingMode::Floor,
60            RoundingMode::Ceiling,
61        ] {
62            let json = serde_json::to_string(&mode).unwrap();
63            let parsed: RoundingMode = serde_json::from_str(&json).unwrap();
64            assert_eq!(mode, parsed);
65        }
66    }
67}