use super::{
Bo4eObject, Bo4eTyped, BoTyp, Marktlokation, Menge, Mengeneinheit, Messlokation, Sparte,
Zeitreihenwert, ZusatzAttribut,
};
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(not(feature = "json"), derive(Eq, 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 Lastgang {
#[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 = "marktlokation"))]
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
#[cfg_attr(feature = "builder", builder(default, setter(into)))]
#[cfg_attr(feature = "validate", garde(dive))]
pub marktlokation: Option<Box<Marktlokation>>,
#[cfg_attr(feature = "serde", serde(rename = "messgroesse"))]
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
#[cfg_attr(feature = "builder", builder(default, setter(into)))]
pub messgroesse: Option<Mengeneinheit>,
#[cfg_attr(feature = "serde", serde(rename = "messlokation"))]
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
#[cfg_attr(feature = "builder", builder(default, setter(into)))]
#[cfg_attr(feature = "validate", garde(dive))]
pub messlokation: Option<Box<Messlokation>>,
#[cfg_attr(feature = "serde", serde(rename = "obisKennzahl"))]
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
#[cfg_attr(feature = "builder", builder(default, setter(into)))]
#[cfg_attr(feature = "validate", garde(dive))]
pub obis_kennzahl: Option<crate::identifiers::ObisCode>,
#[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::Lastgang), 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 = "werte"))]
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
#[cfg_attr(feature = "builder", builder(default, setter(into)))]
#[cfg_attr(feature = "validate", garde(dive))]
pub werte: Option<Vec<Zeitreihenwert>>,
#[cfg_attr(feature = "serde", serde(rename = "zeitIntervallLaenge"))]
#[cfg_attr(feature = "validate", garde(dive))]
pub zeit_intervall_laenge: Menge,
#[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)))]
#[cfg_attr(feature = "validate", garde(dive))]
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 Lastgang {
#[must_use]
pub fn new(zeit_intervall_laenge: Menge) -> Self {
Self {
id: Default::default(),
marktlokation: Default::default(),
messgroesse: Default::default(),
messlokation: Default::default(),
obis_kennzahl: Default::default(),
sparte: Default::default(),
typ: Some(BoTyp::Lastgang),
version: Default::default(),
werte: Default::default(),
zeit_intervall_laenge,
zusatz_attribute: Default::default(),
_additional: Default::default(),
}
}
}
impl Bo4eTyped for Lastgang {
type Typ = BoTyp;
const TYP: BoTyp = BoTyp::Lastgang;
const TYP_WIRE: &'static str = "LASTGANG";
const SCHEMA_VERSION: &'static str = "202607.1.0";
const SCHEMA_SERIES: &'static str = "202607";
}
impl crate::bo4e_typed_sealed::Sealed for Lastgang {}
impl Bo4eObject for Lastgang {}
impl crate::bo4e_object_sealed::Sealed for Lastgang {}
#[cfg(feature = "json")]
impl crate::json::sealed::Sealed for Lastgang {}
#[cfg(feature = "json")]
impl crate::json::Bo4eJsonExt for Lastgang {}
#[cfg(feature = "json")]
impl crate::json::Bo4eExtensionData for Lastgang {
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 Lastgang {
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, "<Lastgang: serialization error: {e}>"),
}
}
}
impl crate::Bo4eStrict for Lastgang {
fn collect_unknown_enums(&self, path: &str, out: &mut Vec<String>) {
if let Some(v) = &self.marktlokation {
crate::Bo4eStrict::collect_unknown_enums(
&**v,
&crate::strict::field_path(path, "marktlokation"),
out,
);
}
if let Some(v) = &self.messgroesse {
crate::Bo4eStrict::collect_unknown_enums(
v,
&crate::strict::field_path(path, "messgroesse"),
out,
);
}
if let Some(v) = &self.messlokation {
crate::Bo4eStrict::collect_unknown_enums(
&**v,
&crate::strict::field_path(path, "messlokation"),
out,
);
}
if let Some(v) = &self.sparte {
crate::Bo4eStrict::collect_unknown_enums(
v,
&crate::strict::field_path(path, "sparte"),
out,
);
}
if let Some(items) = &self.werte {
let child = crate::strict::field_path(path, "werte");
for (i, item) in items.iter().enumerate() {
crate::Bo4eStrict::collect_unknown_enums(
item,
&crate::strict::index_path(&child, i),
out,
);
}
}
crate::Bo4eStrict::collect_unknown_enums(
&self.zeit_intervall_laenge,
&crate::strict::field_path(path, "zeitIntervallLaenge"),
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,
);
}
}
}
}