#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(
feature = "strum",
derive(strum::EnumString, strum::EnumIter, strum::IntoStaticStr)
)]
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[non_exhaustive]
pub enum BoTyp {
#[cfg_attr(feature = "serde", serde(rename = "ANGEBOT"))]
#[cfg_attr(feature = "strum", strum(serialize = "ANGEBOT"))]
Angebot,
#[cfg_attr(feature = "serde", serde(rename = "AUSSCHREIBUNG"))]
#[cfg_attr(feature = "strum", strum(serialize = "AUSSCHREIBUNG"))]
Ausschreibung,
#[cfg_attr(feature = "serde", serde(rename = "BILANZIERUNG"))]
#[cfg_attr(feature = "strum", strum(serialize = "BILANZIERUNG"))]
Bilanzierung,
#[cfg_attr(feature = "serde", serde(rename = "BUENDELVERTRAG"))]
#[cfg_attr(feature = "strum", strum(serialize = "BUENDELVERTRAG"))]
Buendelvertrag,
#[cfg_attr(feature = "serde", serde(rename = "ENERGIEMENGE"))]
#[cfg_attr(feature = "strum", strum(serialize = "ENERGIEMENGE"))]
Energiemenge,
#[cfg_attr(feature = "serde", serde(rename = "FREMDKOSTEN"))]
#[cfg_attr(feature = "strum", strum(serialize = "FREMDKOSTEN"))]
Fremdkosten,
#[cfg_attr(feature = "serde", serde(rename = "GERAET"))]
#[cfg_attr(feature = "strum", strum(serialize = "GERAET"))]
Geraet,
#[cfg_attr(feature = "serde", serde(rename = "GESCHAEFTSOBJEKT"))]
#[cfg_attr(feature = "strum", strum(serialize = "GESCHAEFTSOBJEKT"))]
Geschaeftsobjekt,
#[cfg_attr(feature = "serde", serde(rename = "GESCHAEFTSPARTNER"))]
#[cfg_attr(feature = "strum", strum(serialize = "GESCHAEFTSPARTNER"))]
Geschaeftspartner,
#[cfg_attr(feature = "serde", serde(rename = "KOSTEN"))]
#[cfg_attr(feature = "strum", strum(serialize = "KOSTEN"))]
Kosten,
#[cfg_attr(feature = "serde", serde(rename = "LASTGANG"))]
#[cfg_attr(feature = "strum", strum(serialize = "LASTGANG"))]
Lastgang,
#[cfg_attr(feature = "serde", serde(rename = "MARKTLOKATION"))]
#[cfg_attr(feature = "strum", strum(serialize = "MARKTLOKATION"))]
Marktlokation,
#[cfg_attr(feature = "serde", serde(rename = "MESSLOKATION"))]
#[cfg_attr(feature = "strum", strum(serialize = "MESSLOKATION"))]
Messlokation,
#[cfg_attr(feature = "serde", serde(rename = "NETZLOKATION"))]
#[cfg_attr(feature = "strum", strum(serialize = "NETZLOKATION"))]
Netzlokation,
#[cfg_attr(feature = "serde", serde(rename = "MARKTTEILNEHMER"))]
#[cfg_attr(feature = "strum", strum(serialize = "MARKTTEILNEHMER"))]
Marktteilnehmer,
#[cfg_attr(feature = "serde", serde(rename = "NETZNUTZUNGSRECHNUNG"))]
#[cfg_attr(feature = "strum", strum(serialize = "NETZNUTZUNGSRECHNUNG"))]
Netznutzungsrechnung,
#[cfg_attr(feature = "serde", serde(rename = "TECHNISCHERESSOURCE"))]
#[cfg_attr(feature = "strum", strum(serialize = "TECHNISCHERESSOURCE"))]
Technischeressource,
#[cfg_attr(feature = "serde", serde(rename = "STEUERBARERESSOURCE"))]
#[cfg_attr(feature = "strum", strum(serialize = "STEUERBARERESSOURCE"))]
Steuerbareressource,
#[cfg_attr(feature = "serde", serde(rename = "PERSON"))]
#[cfg_attr(feature = "strum", strum(serialize = "PERSON"))]
Person,
#[cfg_attr(feature = "serde", serde(rename = "PREISBLATT"))]
#[cfg_attr(feature = "strum", strum(serialize = "PREISBLATT"))]
Preisblatt,
#[cfg_attr(feature = "serde", serde(rename = "PREISBLATTDIENSTLEISTUNG"))]
#[cfg_attr(feature = "strum", strum(serialize = "PREISBLATTDIENSTLEISTUNG"))]
Preisblattdienstleistung,
#[cfg_attr(feature = "serde", serde(rename = "PREISBLATTHARDWARE"))]
#[cfg_attr(feature = "strum", strum(serialize = "PREISBLATTHARDWARE"))]
Preisblatthardware,
#[cfg_attr(feature = "serde", serde(rename = "PREISBLATTKONZESSIONSABGABE"))]
#[cfg_attr(feature = "strum", strum(serialize = "PREISBLATTKONZESSIONSABGABE"))]
Preisblattkonzessionsabgabe,
#[cfg_attr(feature = "serde", serde(rename = "PREISBLATTMESSUNG"))]
#[cfg_attr(feature = "strum", strum(serialize = "PREISBLATTMESSUNG"))]
Preisblattmessung,
#[cfg_attr(feature = "serde", serde(rename = "PREISBLATTNETZNUTZUNG"))]
#[cfg_attr(feature = "strum", strum(serialize = "PREISBLATTNETZNUTZUNG"))]
Preisblattnetznutzung,
#[cfg_attr(feature = "serde", serde(rename = "PREISBLATTUMLAGEN"))]
#[cfg_attr(feature = "strum", strum(serialize = "PREISBLATTUMLAGEN"))]
Preisblattumlagen,
#[cfg_attr(feature = "serde", serde(rename = "RECHNUNG"))]
#[cfg_attr(feature = "strum", strum(serialize = "RECHNUNG"))]
Rechnung,
#[cfg_attr(feature = "serde", serde(rename = "REGION"))]
#[cfg_attr(feature = "strum", strum(serialize = "REGION"))]
Region,
#[cfg_attr(feature = "serde", serde(rename = "STANDORTEIGENSCHAFTEN"))]
#[cfg_attr(feature = "strum", strum(serialize = "STANDORTEIGENSCHAFTEN"))]
Standorteigenschaften,
#[cfg_attr(feature = "serde", serde(rename = "TARIF"))]
#[cfg_attr(feature = "strum", strum(serialize = "TARIF"))]
Tarif,
#[cfg_attr(feature = "serde", serde(rename = "TARIFINFO"))]
#[cfg_attr(feature = "strum", strum(serialize = "TARIFINFO"))]
Tarifinfo,
#[cfg_attr(feature = "serde", serde(rename = "TARIFKOSTEN"))]
#[cfg_attr(feature = "strum", strum(serialize = "TARIFKOSTEN"))]
Tarifkosten,
#[cfg_attr(feature = "serde", serde(rename = "TARIFPREISBLATT"))]
#[cfg_attr(feature = "strum", strum(serialize = "TARIFPREISBLATT"))]
Tarifpreisblatt,
#[cfg_attr(feature = "serde", serde(rename = "VERTRAG"))]
#[cfg_attr(feature = "strum", strum(serialize = "VERTRAG"))]
Vertrag,
#[cfg_attr(feature = "serde", serde(rename = "ZAEHLER"))]
#[cfg_attr(feature = "strum", strum(serialize = "ZAEHLER"))]
Zaehler,
#[cfg_attr(feature = "serde", serde(rename = "ZAEHLZEITDEFINITION"))]
#[cfg_attr(feature = "strum", strum(serialize = "ZAEHLZEITDEFINITION"))]
Zaehlzeitdefinition,
#[cfg_attr(feature = "serde", serde(rename = "ZEITREIHE"))]
#[cfg_attr(feature = "strum", strum(serialize = "ZEITREIHE"))]
Zeitreihe,
#[cfg_attr(feature = "serde", serde(rename = "LOKATIONSZUORDNUNG"))]
#[cfg_attr(feature = "strum", strum(serialize = "LOKATIONSZUORDNUNG"))]
Lokationszuordnung,
#[cfg_attr(feature = "serde", serde(other, rename = "UNKNOWN"))]
#[cfg_attr(feature = "strum", strum(serialize = "UNKNOWN"))]
Unknown,
}
impl BoTyp {
pub const VARIANTS: &'static [Self] = &[
Self::Angebot,
Self::Ausschreibung,
Self::Bilanzierung,
Self::Buendelvertrag,
Self::Energiemenge,
Self::Fremdkosten,
Self::Geraet,
Self::Geschaeftsobjekt,
Self::Geschaeftspartner,
Self::Kosten,
Self::Lastgang,
Self::Marktlokation,
Self::Messlokation,
Self::Netzlokation,
Self::Marktteilnehmer,
Self::Netznutzungsrechnung,
Self::Technischeressource,
Self::Steuerbareressource,
Self::Person,
Self::Preisblatt,
Self::Preisblattdienstleistung,
Self::Preisblatthardware,
Self::Preisblattkonzessionsabgabe,
Self::Preisblattmessung,
Self::Preisblattnetznutzung,
Self::Preisblattumlagen,
Self::Rechnung,
Self::Region,
Self::Standorteigenschaften,
Self::Tarif,
Self::Tarifinfo,
Self::Tarifkosten,
Self::Tarifpreisblatt,
Self::Vertrag,
Self::Zaehler,
Self::Zaehlzeitdefinition,
Self::Zeitreihe,
Self::Lokationszuordnung,
];
pub const COUNT: usize = Self::VARIANTS.len();
pub fn iter_known() -> impl Iterator<Item = Self> + Clone {
Self::VARIANTS.iter().copied()
}
pub const fn as_wire(&self) -> &'static str {
match self {
Self::Angebot => "ANGEBOT",
Self::Ausschreibung => "AUSSCHREIBUNG",
Self::Bilanzierung => "BILANZIERUNG",
Self::Buendelvertrag => "BUENDELVERTRAG",
Self::Energiemenge => "ENERGIEMENGE",
Self::Fremdkosten => "FREMDKOSTEN",
Self::Geraet => "GERAET",
Self::Geschaeftsobjekt => "GESCHAEFTSOBJEKT",
Self::Geschaeftspartner => "GESCHAEFTSPARTNER",
Self::Kosten => "KOSTEN",
Self::Lastgang => "LASTGANG",
Self::Marktlokation => "MARKTLOKATION",
Self::Messlokation => "MESSLOKATION",
Self::Netzlokation => "NETZLOKATION",
Self::Marktteilnehmer => "MARKTTEILNEHMER",
Self::Netznutzungsrechnung => "NETZNUTZUNGSRECHNUNG",
Self::Technischeressource => "TECHNISCHERESSOURCE",
Self::Steuerbareressource => "STEUERBARERESSOURCE",
Self::Person => "PERSON",
Self::Preisblatt => "PREISBLATT",
Self::Preisblattdienstleistung => "PREISBLATTDIENSTLEISTUNG",
Self::Preisblatthardware => "PREISBLATTHARDWARE",
Self::Preisblattkonzessionsabgabe => "PREISBLATTKONZESSIONSABGABE",
Self::Preisblattmessung => "PREISBLATTMESSUNG",
Self::Preisblattnetznutzung => "PREISBLATTNETZNUTZUNG",
Self::Preisblattumlagen => "PREISBLATTUMLAGEN",
Self::Rechnung => "RECHNUNG",
Self::Region => "REGION",
Self::Standorteigenschaften => "STANDORTEIGENSCHAFTEN",
Self::Tarif => "TARIF",
Self::Tarifinfo => "TARIFINFO",
Self::Tarifkosten => "TARIFKOSTEN",
Self::Tarifpreisblatt => "TARIFPREISBLATT",
Self::Vertrag => "VERTRAG",
Self::Zaehler => "ZAEHLER",
Self::Zaehlzeitdefinition => "ZAEHLZEITDEFINITION",
Self::Zeitreihe => "ZEITREIHE",
Self::Lokationszuordnung => "LOKATIONSZUORDNUNG",
Self::Unknown => "UNKNOWN",
}
}
pub fn from_wire(s: &str) -> Result<Self, crate::error::UnknownVariant> {
match s {
"ANGEBOT" => Ok(Self::Angebot),
"AUSSCHREIBUNG" => Ok(Self::Ausschreibung),
"BILANZIERUNG" => Ok(Self::Bilanzierung),
"BUENDELVERTRAG" => Ok(Self::Buendelvertrag),
"ENERGIEMENGE" => Ok(Self::Energiemenge),
"FREMDKOSTEN" => Ok(Self::Fremdkosten),
"GERAET" => Ok(Self::Geraet),
"GESCHAEFTSOBJEKT" => Ok(Self::Geschaeftsobjekt),
"GESCHAEFTSPARTNER" => Ok(Self::Geschaeftspartner),
"KOSTEN" => Ok(Self::Kosten),
"LASTGANG" => Ok(Self::Lastgang),
"MARKTLOKATION" => Ok(Self::Marktlokation),
"MESSLOKATION" => Ok(Self::Messlokation),
"NETZLOKATION" => Ok(Self::Netzlokation),
"MARKTTEILNEHMER" => Ok(Self::Marktteilnehmer),
"NETZNUTZUNGSRECHNUNG" => Ok(Self::Netznutzungsrechnung),
"TECHNISCHERESSOURCE" => Ok(Self::Technischeressource),
"STEUERBARERESSOURCE" => Ok(Self::Steuerbareressource),
"PERSON" => Ok(Self::Person),
"PREISBLATT" => Ok(Self::Preisblatt),
"PREISBLATTDIENSTLEISTUNG" => Ok(Self::Preisblattdienstleistung),
"PREISBLATTHARDWARE" => Ok(Self::Preisblatthardware),
"PREISBLATTKONZESSIONSABGABE" => Ok(Self::Preisblattkonzessionsabgabe),
"PREISBLATTMESSUNG" => Ok(Self::Preisblattmessung),
"PREISBLATTNETZNUTZUNG" => Ok(Self::Preisblattnetznutzung),
"PREISBLATTUMLAGEN" => Ok(Self::Preisblattumlagen),
"RECHNUNG" => Ok(Self::Rechnung),
"REGION" => Ok(Self::Region),
"STANDORTEIGENSCHAFTEN" => Ok(Self::Standorteigenschaften),
"TARIF" => Ok(Self::Tarif),
"TARIFINFO" => Ok(Self::Tarifinfo),
"TARIFKOSTEN" => Ok(Self::Tarifkosten),
"TARIFPREISBLATT" => Ok(Self::Tarifpreisblatt),
"VERTRAG" => Ok(Self::Vertrag),
"ZAEHLER" => Ok(Self::Zaehler),
"ZAEHLZEITDEFINITION" => Ok(Self::Zaehlzeitdefinition),
"ZEITREIHE" => Ok(Self::Zeitreihe),
"LOKATIONSZUORDNUNG" => Ok(Self::Lokationszuordnung),
other => Err(crate::error::UnknownVariant::new(other)),
}
}
pub const fn is_unknown(&self) -> bool {
matches!(self, Self::Unknown)
}
pub const fn is_known(&self) -> bool {
!self.is_unknown()
}
}
impl std::fmt::Display for BoTyp {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.as_wire())
}
}
impl AsRef<str> for BoTyp {
fn as_ref(&self) -> &str {
self.as_wire()
}
}
#[cfg(feature = "versioned")]
impl crate::bo4e_enum_sealed::Sealed for BoTyp {}
#[cfg(feature = "versioned")]
impl crate::Bo4eEnum for BoTyp {
const VARIANTS: &'static [Self] = Self::VARIANTS;
const COUNT: usize = Self::COUNT;
fn as_wire(&self) -> &'static str {
Self::as_wire(self)
}
fn from_wire(s: &str) -> Result<Self, crate::error::UnknownVariant> {
Self::from_wire(s)
}
fn is_unknown(&self) -> bool {
Self::is_unknown(self)
}
}
#[cfg(feature = "versioned")]
impl crate::Bo4eStrict for BoTyp {
fn collect_unknown_enums(&self, path: &str, out: &mut Vec<String>) {
if self.is_unknown() {
out.push(path.to_owned());
}
}
}
#[cfg(feature = "sqlx")]
impl sqlx::Type<sqlx::Postgres> for BoTyp {
fn type_info() -> sqlx::postgres::PgTypeInfo {
<String as sqlx::Type<sqlx::Postgres>>::type_info()
}
}
#[cfg(feature = "sqlx")]
impl<'q> sqlx::Encode<'q, sqlx::Postgres> for BoTyp {
fn encode_by_ref(
&self,
buf: &mut <sqlx::Postgres as sqlx::Database>::ArgumentBuffer<'q>,
) -> Result<sqlx::encode::IsNull, sqlx::error::BoxDynError> {
let s: &str = self.as_wire();
<&str as sqlx::Encode<'q, sqlx::Postgres>>::encode_by_ref(&s, buf)
}
}
#[cfg(feature = "sqlx")]
impl<'r> sqlx::Decode<'r, sqlx::Postgres> for BoTyp {
fn decode(
value: <sqlx::Postgres as sqlx::Database>::ValueRef<'r>,
) -> Result<Self, sqlx::error::BoxDynError> {
let s = <&str as sqlx::Decode<sqlx::Postgres>>::decode(value)?;
Ok(Self::from_wire(s).unwrap_or(Self::Unknown))
}
}
#[cfg(test)]
impl proptest::arbitrary::Arbitrary for BoTyp {
type Parameters = ();
type Strategy = proptest::strategy::BoxedStrategy<Self>;
fn arbitrary_with(_: Self::Parameters) -> Self::Strategy {
use proptest::prelude::*;
proptest::sample::select(Self::VARIANTS.to_vec()).boxed()
}
}