use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StartupTier {
pub max_offline_hours: f64,
pub cost: f64,
pub sync_time_min: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OfferCurve {
pub segments: Vec<(f64, f64)>,
pub no_load_cost: f64,
pub startup_tiers: Vec<StartupTier>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EnergyOffer {
pub submitted: OfferCurve,
pub mitigated: Option<OfferCurve>,
pub mitigation_active: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OfferSchedule {
pub periods: Vec<Option<OfferCurve>>,
}
impl OfferSchedule {
pub fn offer_for_period<'a>(
&'a self,
period: usize,
default: &'a OfferCurve,
) -> &'a OfferCurve {
self.periods
.get(period)
.and_then(|o| o.as_ref())
.unwrap_or(default)
}
pub fn constant(curve: OfferCurve, n_periods: usize) -> Self {
Self {
periods: vec![Some(curve); n_periods],
}
}
pub fn empty(n_periods: usize) -> Self {
Self {
periods: vec![None; n_periods],
}
}
pub fn len(&self) -> usize {
self.periods.len()
}
pub fn is_empty(&self) -> bool {
self.periods.is_empty()
}
}