use serde::{Deserialize, Deserializer, Serialize};
#[derive(Debug, Clone, Deserialize, Serialize, Default)]
#[serde(default, deny_unknown_fields)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct RawScenarioSourceConfig {
#[serde(default)]
pub seed: Option<i64>,
#[serde(default)]
pub historical_years: Option<RawHistoricalYearsConfig>,
#[serde(default)]
pub inflow: Option<RawClassConfigEntry>,
#[serde(default)]
pub load: Option<RawClassConfigEntry>,
#[serde(default)]
pub ncs: Option<RawClassConfigEntry>,
#[serde(default)]
pub openings: Option<Openings>,
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(tag = "source", rename_all = "snake_case", deny_unknown_fields)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub enum Openings {
Generated {},
File {},
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(deny_unknown_fields)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct RawClassConfigEntry {
pub scheme: RawSamplingScheme,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
#[serde(rename_all = "snake_case")]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub enum RawSamplingScheme {
InSample,
OutOfSample,
External,
Historical,
}
impl<'de> Deserialize<'de> for RawSamplingScheme {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let s = String::deserialize(deserializer)?;
match s.as_str() {
"in_sample" => Ok(Self::InSample),
"out_of_sample" => Ok(Self::OutOfSample),
"external" => Ok(Self::External),
"historical" => Ok(Self::Historical),
other => Err(serde::de::Error::unknown_variant(
other,
&["in_sample", "out_of_sample", "external", "historical"],
)),
}
}
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(untagged)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub enum RawHistoricalYearsConfig {
List(Vec<i32>),
Range(HistoricalYearRange),
}
#[derive(Debug, Clone, Copy, Deserialize, Serialize)]
#[serde(deny_unknown_fields)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct HistoricalYearRange {
pub from: i32,
pub to: i32,
}