#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
#[non_exhaustive]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(rename_all = "SCREAMING_SNAKE_CASE"))]
pub enum ErzeugungsArt {
#[default]
Solar,
SolarAufdach,
SolarFreiflaeche,
SolarAgriPv,
SolarMieterstrom,
SolarStecker,
WindOnshore,
WindOffshore,
Biomasse,
BiomassHolz,
Biogas,
Biomethan,
Klaegas,
Grubengas,
Deponiegas,
Wasserkraft,
Geothermie,
Gezeiten,
Kwk,
}
impl ErzeugungsArt {
pub fn is_wind(self) -> bool {
matches!(self, Self::WindOnshore | Self::WindOffshore)
}
pub fn is_solar(self) -> bool {
matches!(
self,
Self::Solar
| Self::SolarAufdach
| Self::SolarFreiflaeche
| Self::SolarAgriPv
| Self::SolarMieterstrom
| Self::SolarStecker
)
}
pub fn is_biomasse_or_gas(self) -> bool {
matches!(
self,
Self::Biomasse
| Self::BiomassHolz
| Self::Biogas
| Self::Biomethan
| Self::Klaegas
| Self::Grubengas
| Self::Deponiegas
)
}
pub fn from_db_str(s: &str) -> Result<Self, InvalidErzeugungsArt> {
match s {
"SOLAR" => Ok(Self::Solar),
"SOLAR_AUFDACH" => Ok(Self::SolarAufdach),
"SOLAR_FREFLAECHE" => Ok(Self::SolarFreiflaeche),
"SOLAR_AGRIPV" => Ok(Self::SolarAgriPv),
"SOLAR_MIETERSTROM" => Ok(Self::SolarMieterstrom),
"SOLAR_STECKER" => Ok(Self::SolarStecker),
"WIND_ONSHORE" => Ok(Self::WindOnshore),
"WIND_OFFSHORE" => Ok(Self::WindOffshore),
"BIOMASSE" => Ok(Self::Biomasse),
"BIOMASSE_HOLZ" => Ok(Self::BiomassHolz),
"BIOGAS" => Ok(Self::Biogas),
"BIOMETHAN" => Ok(Self::Biomethan),
"KLAEGAS" => Ok(Self::Klaegas),
"GRUBENGAS" => Ok(Self::Grubengas),
"DEPONIEGAS" => Ok(Self::Deponiegas),
"WASSERKRAFT" => Ok(Self::Wasserkraft),
"GEOTHERMIE" => Ok(Self::Geothermie),
"GEZEITEN" => Ok(Self::Gezeiten),
"KWKG" => Ok(Self::Kwk),
_ => Err(InvalidErzeugungsArt(s.to_owned())),
}
}
pub fn to_db_str(self) -> &'static str {
match self {
Self::Solar => "SOLAR",
Self::SolarAufdach => "SOLAR_AUFDACH",
Self::SolarFreiflaeche => "SOLAR_FREFLAECHE",
Self::SolarAgriPv => "SOLAR_AGRIPV",
Self::SolarMieterstrom => "SOLAR_MIETERSTROM",
Self::SolarStecker => "SOLAR_STECKER",
Self::WindOnshore => "WIND_ONSHORE",
Self::WindOffshore => "WIND_OFFSHORE",
Self::Biomasse => "BIOMASSE",
Self::BiomassHolz => "BIOMASSE_HOLZ",
Self::Biogas => "BIOGAS",
Self::Biomethan => "BIOMETHAN",
Self::Klaegas => "KLAEGAS",
Self::Grubengas => "GRUBENGAS",
Self::Deponiegas => "DEPONIEGAS",
Self::Wasserkraft => "WASSERKRAFT",
Self::Geothermie => "GEOTHERMIE",
Self::Gezeiten => "GEZEITEN",
Self::Kwk => "KWKG",
}
}
}
#[derive(Debug, thiserror::Error)]
#[error("unknown erzeugungsart: {0:?}")]
pub struct InvalidErzeugungsArt(pub String);
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(rename_all = "SCREAMING_SNAKE_CASE"))]
pub enum InbetriebnahmeTyp {
#[default]
Erstinbetriebnahme,
Wiederinbetriebnahme,
Modernisierung,
Repowering,
Zusammenlegung,
Erweiterung,
}
impl InbetriebnahmeTyp {
#[must_use]
pub fn resets_foerderdauer(self) -> bool {
self == Self::Repowering
}
#[must_use]
pub fn is_erstinbetriebnahme(self) -> bool {
self == Self::Erstinbetriebnahme
}
pub fn from_db_str(s: &str) -> Result<Self, InvalidInbetriebnahmeTyp> {
match s {
"ERSTINBETRIEBNAHME" => Ok(Self::Erstinbetriebnahme),
"WIEDERINBETRIEBNAHME" => Ok(Self::Wiederinbetriebnahme),
"MODERNISIERUNG" => Ok(Self::Modernisierung),
"REPOWERING" => Ok(Self::Repowering),
"ZUSAMMENLEGUNG" => Ok(Self::Zusammenlegung),
"ERWEITERUNG" => Ok(Self::Erweiterung),
_ => Err(InvalidInbetriebnahmeTyp(s.to_owned())),
}
}
#[must_use]
pub fn to_db_str(self) -> &'static str {
match self {
Self::Erstinbetriebnahme => "ERSTINBETRIEBNAHME",
Self::Wiederinbetriebnahme => "WIEDERINBETRIEBNAHME",
Self::Modernisierung => "MODERNISIERUNG",
Self::Repowering => "REPOWERING",
Self::Zusammenlegung => "ZUSAMMENLEGUNG",
Self::Erweiterung => "ERWEITERUNG",
}
}
}
#[derive(Debug, thiserror::Error)]
#[error("unknown inbetriebnahme_typ: {0:?}")]
pub struct InvalidInbetriebnahmeTyp(pub String);
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(rename_all = "SCREAMING_SNAKE_CASE"))]
pub enum RepoweringScope {
Full,
RotorOnly,
NacelleAndRotor,
TurbineUnit,
FullWithCapacityIncrease,
}
impl RepoweringScope {
#[must_use]
pub fn resets_foerderdauer_definitely(self) -> bool {
matches!(self, Self::Full | Self::FullWithCapacityIncrease)
}
#[must_use]
pub fn replaces_generating_unit(self) -> bool {
matches!(
self,
Self::Full | Self::FullWithCapacityIncrease | Self::NacelleAndRotor | Self::TurbineUnit
)
}
}