Skip to main content

rubo4e/generated/v202607/
zaehler.rs

1use super::{
2    Befestigungsart, Bo4eObject, BoTyp, Geraet, Geschaeftspartner, Registeranzahl, Sparte,
3    Zaehlerauspraegung, Zaehlergroesse, Zaehlertyp, ZaehlertypSpezifikation, Zaehlwerk,
4    ZusatzAttribut,
5};
6#[derive(Debug, Clone, PartialEq)]
7#[cfg_attr(not(feature = "json"), derive(Hash))]
8#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
9#[cfg_attr(feature = "builder", derive(typed_builder::TypedBuilder))]
10#[cfg_attr(feature = "validate", derive(garde::Validate))]
11#[cfg_attr(feature = "validate", garde(allow_unvalidated))]
12#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
13#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
14/// Object containing information about a meter/"Zaehler".
15///
16/// > **Note:** [Zaehler JSON Schema](https://json-schema.app/view/%23?url=https://raw.githubusercontent.com/BO4E/BO4E-Schemas/v202607.0.0/src/bo4e_schemas/bo/Zaehler.json)
17pub struct Zaehler {
18    /// Befestigungsart
19    #[cfg_attr(feature = "serde", serde(rename = "befestigungsart"))]
20    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
21    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
22    pub befestigungsart: Option<Befestigungsart>,
23    /// Bis zu diesem Datum (exklusiv) ist der Zähler geeicht.
24    #[cfg_attr(feature = "serde", serde(rename = "eichungBis"))]
25    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
26    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
27    #[cfg_attr(feature = "serde", serde(default))]
28    #[cfg_attr(
29        feature = "schemars",
30        schemars(schema_with = "crate::schema_helpers::opt_datetime_schema")
31    )]
32    #[cfg_attr(
33        all(feature = "serde", feature = "time"),
34        serde(with = "time::serde::rfc3339::option")
35    )]
36    #[cfg(feature = "time")]
37    pub eichung_bis: Option<time::OffsetDateTime>,
38    /// Requires the `time` feature for the `time::OffsetDateTime` representation.
39    /// Without `time`, stores the ISO-8601 string value unchanged.
40    #[cfg_attr(feature = "serde", serde(rename = "eichungBis"))]
41    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
42    #[cfg_attr(feature = "serde", serde(default))]
43    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
44    #[cfg_attr(
45        feature = "schemars",
46        schemars(schema_with = "crate::schema_helpers::opt_datetime_schema")
47    )]
48    #[cfg(not(feature = "time"))]
49    pub eichung_bis: Option<String>,
50    /// Liste der Geräte, die zu diesem Zähler gehören, bspw. Smartmeter-Gateway
51    #[cfg_attr(feature = "serde", serde(rename = "geraete"))]
52    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
53    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
54    pub geraete: Option<Vec<Box<Geraet>>>,
55    /// Eine generische ID, die für eigene Zwecke genutzt werden kann.
56    /// Z.B. könnten hier UUIDs aus einer Datenbank stehen oder URLs zu einem Backend-System.
57    #[cfg_attr(feature = "serde", serde(rename = "_id"))]
58    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
59    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
60    pub id: Option<String>,
61    /// Fernauslesung
62    #[cfg_attr(feature = "serde", serde(rename = "istFernauslesbar"))]
63    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
64    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
65    pub ist_fernauslesbar: Option<bool>,
66    /// Zu diesem Datum fand die letzte Eichprüfung des Zählers statt.
67    #[cfg_attr(feature = "serde", serde(rename = "letzteEichung"))]
68    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
69    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
70    #[cfg_attr(feature = "serde", serde(default))]
71    #[cfg_attr(
72        feature = "schemars",
73        schemars(schema_with = "crate::schema_helpers::opt_datetime_schema")
74    )]
75    #[cfg_attr(
76        all(feature = "serde", feature = "time"),
77        serde(with = "time::serde::rfc3339::option")
78    )]
79    #[cfg(feature = "time")]
80    pub letzte_eichung: Option<time::OffsetDateTime>,
81    /// Requires the `time` feature for the `time::OffsetDateTime` representation.
82    /// Without `time`, stores the ISO-8601 string value unchanged.
83    #[cfg_attr(feature = "serde", serde(rename = "letzteEichung"))]
84    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
85    #[cfg_attr(feature = "serde", serde(default))]
86    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
87    #[cfg_attr(
88        feature = "schemars",
89        schemars(schema_with = "crate::schema_helpers::opt_datetime_schema")
90    )]
91    #[cfg(not(feature = "time"))]
92    pub letzte_eichung: Option<String>,
93    /// Spezifikation bezüglich unterstützter Tarif
94    #[cfg_attr(feature = "serde", serde(rename = "registeranzahl"))]
95    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
96    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
97    pub registeranzahl: Option<Registeranzahl>,
98    /// Strom oder Gas
99    #[cfg_attr(feature = "serde", serde(rename = "sparte"))]
100    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
101    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
102    pub sparte: Option<Sparte>,
103    /// BO type identifier — always `BoTyp::Zaehler` for this struct.
104    #[cfg_attr(feature = "serde", serde(rename = "_typ"))]
105    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
106    #[cfg_attr(
107        feature = "builder",
108        builder(default = Some(BoTyp::Zaehler), setter(skip))
109    )]
110    pub typ: Option<BoTyp>,
111    /// Version der BO-Struktur aka "fachliche Versionierung"
112    #[cfg_attr(feature = "serde", serde(rename = "_version"))]
113    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
114    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
115    pub version: Option<String>,
116    /// Spezifikation die Richtung des Zählers betreffend
117    #[cfg_attr(feature = "serde", serde(rename = "zaehlerauspraegung"))]
118    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
119    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
120    pub zaehlerauspraegung: Option<Zaehlerauspraegung>,
121    /// Größe des Zählers
122    #[cfg_attr(feature = "serde", serde(rename = "zaehlergroesse"))]
123    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
124    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
125    pub zaehlergroesse: Option<Zaehlergroesse>,
126    /// Der Hersteller des Zählers
127    #[cfg_attr(feature = "serde", serde(rename = "zaehlerhersteller"))]
128    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
129    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
130    pub zaehlerhersteller: Option<Box<Geschaeftspartner>>,
131    /// Zählerkonstante auf dem Zähler
132    #[cfg_attr(feature = "serde", serde(rename = "zaehlerkonstante"))]
133    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
134    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
135    #[cfg(feature = "decimal")]
136    pub zaehlerkonstante: Option<rust_decimal::Decimal>,
137    /// Requires the `decimal` feature for the `rust_decimal::Decimal` representation.
138    /// Without `decimal`, stores the decimal string value unchanged.
139    #[cfg_attr(feature = "serde", serde(rename = "zaehlerkonstante"))]
140    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
141    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
142    #[cfg(not(feature = "decimal"))]
143    pub zaehlerkonstante: Option<String>,
144    /// Nummerierung des Zählers,vergeben durch den Messstellenbetreiber
145    #[cfg_attr(feature = "serde", serde(rename = "zaehlernummer"))]
146    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
147    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
148    pub zaehlernummer: Option<String>,
149    /// Typisierung des Zählers
150    #[cfg_attr(feature = "serde", serde(rename = "zaehlertyp"))]
151    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
152    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
153    pub zaehlertyp: Option<Zaehlertyp>,
154    /// Besondere Spezifikation des Zählers
155    #[cfg_attr(feature = "serde", serde(rename = "zaehlertypSpezifikation"))]
156    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
157    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
158    pub zaehlertyp_spezifikation: Option<ZaehlertypSpezifikation>,
159    #[cfg_attr(feature = "serde", serde(rename = "zaehlwerke"))]
160    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
161    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
162    pub zaehlwerke: Option<Vec<Zaehlwerk>>,
163    #[cfg_attr(feature = "serde", serde(rename = "zusatzAttribute"))]
164    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
165    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
166    pub zusatz_attribute: Option<Vec<ZusatzAttribut>>,
167    /// Unknown JSON fields captured during deserialization for round-trip preservation.
168    /// `None` when no unknown fields were present (zero heap allocation).
169    #[cfg_attr(feature = "json", serde(flatten))]
170    #[cfg_attr(
171        feature = "json",
172        serde(skip_serializing_if = "crate::json::ext_map_is_empty")
173    )]
174    #[cfg_attr(not(feature = "json"), serde(skip))]
175    #[cfg_attr(feature = "builder", builder(default, setter(skip)))]
176    #[doc(hidden)]
177    pub _additional: crate::LimitedExtensionMap,
178}
179impl Default for Zaehler {
180    fn default() -> Self {
181        Self {
182            typ: Some(BoTyp::Zaehler),
183            befestigungsart: Default::default(),
184            eichung_bis: Default::default(),
185            geraete: Default::default(),
186            id: Default::default(),
187            ist_fernauslesbar: Default::default(),
188            letzte_eichung: Default::default(),
189            registeranzahl: Default::default(),
190            sparte: Default::default(),
191            version: Default::default(),
192            zaehlerauspraegung: Default::default(),
193            zaehlergroesse: Default::default(),
194            zaehlerhersteller: Default::default(),
195            zaehlerkonstante: Default::default(),
196            zaehlernummer: Default::default(),
197            zaehlertyp: Default::default(),
198            zaehlertyp_spezifikation: Default::default(),
199            zaehlwerke: Default::default(),
200            zusatz_attribute: Default::default(),
201            _additional: Default::default(),
202        }
203    }
204}
205impl Bo4eObject for Zaehler {
206    type BoTyp = BoTyp;
207    fn bo_type(&self) -> BoTyp {
208        self.typ.unwrap_or(BoTyp::Zaehler)
209    }
210    fn schema_version(&self) -> &'static str {
211        "v202607.0.0"
212    }
213}
214#[cfg(feature = "json")]
215impl crate::json::sealed::Sealed for Zaehler {}
216#[cfg(feature = "json")]
217impl crate::json::Bo4eJsonExt for Zaehler {}
218#[cfg(feature = "json")]
219impl crate::json::Bo4eExtensionData for Zaehler {
220    fn extension_data(&self) -> &indexmap::IndexMap<String, serde_json::Value> {
221        self._additional
222            .as_map()
223            .unwrap_or(&crate::json::extension::EMPTY_EXTENSION_MAP)
224    }
225    fn has_extension_data(&self) -> bool {
226        !self._additional.is_empty()
227    }
228}
229#[cfg(feature = "json")]
230impl std::fmt::Display for Zaehler {
231    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
232        match serde_json::to_string(self) {
233            Ok(json) => f.write_str(&json),
234            Err(e) => write!(f, "<Zaehler: serialization error: {e}>"),
235        }
236    }
237}