use super::{
Befestigungsart, Bo4eObject, BoTyp, Geraet, Geschaeftspartner, Registeranzahl, Sparte,
Zaehlerauspraegung, Zaehlergroesse, Zaehlertyp, ZaehlertypSpezifikation, Zaehlwerk,
ZusatzAttribut,
};
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(not(feature = "json"), derive(Hash))]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "builder", derive(typed_builder::TypedBuilder))]
#[cfg_attr(feature = "validate", derive(garde::Validate))]
#[cfg_attr(feature = "validate", garde(allow_unvalidated))]
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
pub struct Zaehler {
#[cfg_attr(feature = "serde", serde(rename = "befestigungsart"))]
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
#[cfg_attr(feature = "builder", builder(default, setter(into)))]
pub befestigungsart: Option<Befestigungsart>,
#[cfg_attr(feature = "serde", serde(rename = "eichungBis"))]
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
#[cfg_attr(feature = "builder", builder(default, setter(into)))]
#[cfg_attr(feature = "serde", serde(default))]
#[cfg_attr(
feature = "schemars",
schemars(schema_with = "crate::schema_helpers::opt_datetime_schema")
)]
#[cfg_attr(
all(feature = "serde", feature = "time"),
serde(with = "time::serde::rfc3339::option")
)]
#[cfg(feature = "time")]
pub eichung_bis: Option<time::OffsetDateTime>,
#[cfg_attr(feature = "serde", serde(rename = "eichungBis"))]
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
#[cfg_attr(feature = "serde", serde(default))]
#[cfg_attr(feature = "builder", builder(default, setter(into)))]
#[cfg_attr(
feature = "schemars",
schemars(schema_with = "crate::schema_helpers::opt_datetime_schema")
)]
#[cfg(not(feature = "time"))]
pub eichung_bis: Option<String>,
#[cfg_attr(feature = "serde", serde(rename = "geraete"))]
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
#[cfg_attr(feature = "builder", builder(default, setter(into)))]
pub geraete: Option<Vec<Box<Geraet>>>,
#[cfg_attr(feature = "serde", serde(rename = "_id"))]
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
#[cfg_attr(feature = "builder", builder(default, setter(into)))]
pub id: Option<String>,
#[cfg_attr(feature = "serde", serde(rename = "istFernauslesbar"))]
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
#[cfg_attr(feature = "builder", builder(default, setter(into)))]
pub ist_fernauslesbar: Option<bool>,
#[cfg_attr(feature = "serde", serde(rename = "letzteEichung"))]
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
#[cfg_attr(feature = "builder", builder(default, setter(into)))]
#[cfg_attr(feature = "serde", serde(default))]
#[cfg_attr(
feature = "schemars",
schemars(schema_with = "crate::schema_helpers::opt_datetime_schema")
)]
#[cfg_attr(
all(feature = "serde", feature = "time"),
serde(with = "time::serde::rfc3339::option")
)]
#[cfg(feature = "time")]
pub letzte_eichung: Option<time::OffsetDateTime>,
#[cfg_attr(feature = "serde", serde(rename = "letzteEichung"))]
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
#[cfg_attr(feature = "serde", serde(default))]
#[cfg_attr(feature = "builder", builder(default, setter(into)))]
#[cfg_attr(
feature = "schemars",
schemars(schema_with = "crate::schema_helpers::opt_datetime_schema")
)]
#[cfg(not(feature = "time"))]
pub letzte_eichung: Option<String>,
#[cfg_attr(feature = "serde", serde(rename = "registeranzahl"))]
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
#[cfg_attr(feature = "builder", builder(default, setter(into)))]
pub registeranzahl: Option<Registeranzahl>,
#[cfg_attr(feature = "serde", serde(rename = "sparte"))]
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
#[cfg_attr(feature = "builder", builder(default, setter(into)))]
pub sparte: Option<Sparte>,
#[cfg_attr(feature = "serde", serde(rename = "_typ"))]
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
#[cfg_attr(
feature = "builder",
builder(default = Some(BoTyp::Zaehler), setter(skip))
)]
pub typ: Option<BoTyp>,
#[cfg_attr(feature = "serde", serde(rename = "_version"))]
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
#[cfg_attr(feature = "builder", builder(default, setter(into)))]
pub version: Option<String>,
#[cfg_attr(feature = "serde", serde(rename = "zaehlerauspraegung"))]
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
#[cfg_attr(feature = "builder", builder(default, setter(into)))]
pub zaehlerauspraegung: Option<Zaehlerauspraegung>,
#[cfg_attr(feature = "serde", serde(rename = "zaehlergroesse"))]
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
#[cfg_attr(feature = "builder", builder(default, setter(into)))]
pub zaehlergroesse: Option<Zaehlergroesse>,
#[cfg_attr(feature = "serde", serde(rename = "zaehlerhersteller"))]
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
#[cfg_attr(feature = "builder", builder(default, setter(into)))]
pub zaehlerhersteller: Option<Box<Geschaeftspartner>>,
#[cfg_attr(feature = "serde", serde(rename = "zaehlerkonstante"))]
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
#[cfg_attr(feature = "builder", builder(default, setter(into)))]
#[cfg(feature = "decimal")]
pub zaehlerkonstante: Option<rust_decimal::Decimal>,
#[cfg_attr(feature = "serde", serde(rename = "zaehlerkonstante"))]
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
#[cfg_attr(feature = "builder", builder(default, setter(into)))]
#[cfg(not(feature = "decimal"))]
pub zaehlerkonstante: Option<String>,
#[cfg_attr(feature = "serde", serde(rename = "zaehlernummer"))]
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
#[cfg_attr(feature = "builder", builder(default, setter(into)))]
pub zaehlernummer: Option<String>,
#[cfg_attr(feature = "serde", serde(rename = "zaehlertyp"))]
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
#[cfg_attr(feature = "builder", builder(default, setter(into)))]
pub zaehlertyp: Option<Zaehlertyp>,
#[cfg_attr(feature = "serde", serde(rename = "zaehlertypSpezifikation"))]
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
#[cfg_attr(feature = "builder", builder(default, setter(into)))]
pub zaehlertyp_spezifikation: Option<ZaehlertypSpezifikation>,
#[cfg_attr(feature = "serde", serde(rename = "zaehlwerke"))]
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
#[cfg_attr(feature = "builder", builder(default, setter(into)))]
pub zaehlwerke: Option<Vec<Zaehlwerk>>,
#[cfg_attr(feature = "serde", serde(rename = "zusatzAttribute"))]
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
#[cfg_attr(feature = "builder", builder(default, setter(into)))]
pub zusatz_attribute: Option<Vec<ZusatzAttribut>>,
#[cfg_attr(feature = "json", serde(flatten))]
#[cfg_attr(
feature = "json",
serde(skip_serializing_if = "crate::json::ext_map_is_empty")
)]
#[cfg_attr(not(feature = "json"), serde(skip))]
#[cfg_attr(feature = "builder", builder(default, setter(skip)))]
#[doc(hidden)]
pub _additional: crate::LimitedExtensionMap,
}
impl Default for Zaehler {
fn default() -> Self {
Self {
typ: Some(BoTyp::Zaehler),
befestigungsart: Default::default(),
eichung_bis: Default::default(),
geraete: Default::default(),
id: Default::default(),
ist_fernauslesbar: Default::default(),
letzte_eichung: Default::default(),
registeranzahl: Default::default(),
sparte: Default::default(),
version: Default::default(),
zaehlerauspraegung: Default::default(),
zaehlergroesse: Default::default(),
zaehlerhersteller: Default::default(),
zaehlerkonstante: Default::default(),
zaehlernummer: Default::default(),
zaehlertyp: Default::default(),
zaehlertyp_spezifikation: Default::default(),
zaehlwerke: Default::default(),
zusatz_attribute: Default::default(),
_additional: Default::default(),
}
}
}
impl Bo4eObject for Zaehler {
type BoTyp = BoTyp;
fn bo_type(&self) -> BoTyp {
self.typ.unwrap_or(BoTyp::Zaehler)
}
fn schema_version(&self) -> &'static str {
"v202607.0.0"
}
}
#[cfg(feature = "json")]
impl crate::json::sealed::Sealed for Zaehler {}
#[cfg(feature = "json")]
impl crate::json::Bo4eJsonExt for Zaehler {}
#[cfg(feature = "json")]
impl crate::json::Bo4eExtensionData for Zaehler {
fn extension_data(&self) -> &indexmap::IndexMap<String, serde_json::Value> {
self._additional
.as_map()
.unwrap_or(&crate::json::extension::EMPTY_EXTENSION_MAP)
}
fn has_extension_data(&self) -> bool {
!self._additional.is_empty()
}
}
#[cfg(feature = "json")]
impl std::fmt::Display for Zaehler {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match serde_json::to_string(self) {
Ok(json) => f.write_str(&json),
Err(e) => write!(f, "<Zaehler: serialization error: {e}>"),
}
}
}
impl crate::Bo4eStrict for Zaehler {
fn collect_unknown_enums(&self, path: &str, out: &mut Vec<String>) {
if let Some(v) = &self.befestigungsart {
crate::Bo4eStrict::collect_unknown_enums(
v,
&crate::strict::field_path(path, "befestigungsart"),
out,
);
}
if let Some(items) = &self.geraete {
let child = crate::strict::field_path(path, "geraete");
for (i, item) in items.iter().enumerate() {
crate::Bo4eStrict::collect_unknown_enums(
&**item,
&crate::strict::index_path(&child, i),
out,
);
}
}
if let Some(v) = &self.registeranzahl {
crate::Bo4eStrict::collect_unknown_enums(
v,
&crate::strict::field_path(path, "registeranzahl"),
out,
);
}
if let Some(v) = &self.sparte {
crate::Bo4eStrict::collect_unknown_enums(
v,
&crate::strict::field_path(path, "sparte"),
out,
);
}
if let Some(v) = &self.zaehlerauspraegung {
crate::Bo4eStrict::collect_unknown_enums(
v,
&crate::strict::field_path(path, "zaehlerauspraegung"),
out,
);
}
if let Some(v) = &self.zaehlergroesse {
crate::Bo4eStrict::collect_unknown_enums(
v,
&crate::strict::field_path(path, "zaehlergroesse"),
out,
);
}
if let Some(v) = &self.zaehlerhersteller {
crate::Bo4eStrict::collect_unknown_enums(
&**v,
&crate::strict::field_path(path, "zaehlerhersteller"),
out,
);
}
if let Some(v) = &self.zaehlertyp {
crate::Bo4eStrict::collect_unknown_enums(
v,
&crate::strict::field_path(path, "zaehlertyp"),
out,
);
}
if let Some(v) = &self.zaehlertyp_spezifikation {
crate::Bo4eStrict::collect_unknown_enums(
v,
&crate::strict::field_path(path, "zaehlertypSpezifikation"),
out,
);
}
if let Some(items) = &self.zaehlwerke {
let child = crate::strict::field_path(path, "zaehlwerke");
for (i, item) in items.iter().enumerate() {
crate::Bo4eStrict::collect_unknown_enums(
item,
&crate::strict::index_path(&child, i),
out,
);
}
}
if let Some(items) = &self.zusatz_attribute {
let child = crate::strict::field_path(path, "zusatzAttribute");
for (i, item) in items.iter().enumerate() {
crate::Bo4eStrict::collect_unknown_enums(
item,
&crate::strict::index_path(&child, i),
out,
);
}
}
}
}