aemo-rs 0.1.0

This library contains functions to read AEMO nemweb data files (zipped CSV files with one or more sub files inside) to Rust Structs
Documentation
use crate::{AemoFile, FileKeyable, GetFromRawAemo, RawAemoFile, Result};
use serde::{Deserialize, Serialize};

#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct File {
    header: crate::AemoHeader,
    case_solution: Vec<CaseSolution>,
}

impl AemoFile for File {
    fn from_raw(RawAemoFile { header, mut data }: RawAemoFile) -> Result<Self> {
        Ok(Self {
            header,
            case_solution: CaseSolution::from_map(&mut data)?,
        })
    }
}

#[derive(Deserialize, Serialize, Debug, Clone)]
struct CaseSolution {
    #[serde(deserialize_with = "crate::au_datetime_deserialize")]
    settlementdate: chrono::NaiveDateTime,
    runno: i32,
    intervention: i32,
    casesubtype: Option<String>,
    solutionstatus: i32,
    spdversion: Option<String>,
    nonphysicallosses: i32,
    totalobjective: f64,
    totalareagenviolation: Option<f64>,
    totalinterconnectorviolation: Option<f64>,
    totalgenericviolation: Option<f64>,
    totalramprateviolation: Option<f64>,
    totalunitmwcapacityviolation: Option<f64>,
    total5minviolation: Option<f64>,
    totalregviolation: Option<f64>,
    total6secviolation: Option<f64>,
    total60secviolation: Option<f64>,
    totalasprofileviolation: Option<f64>,
    totalfaststartviolation: Option<f64>,
    totalenergyofferviolation: Option<f64>,
    #[serde(deserialize_with = "crate::au_datetime_deserialize")]
    lastchanged: chrono::NaiveDateTime,
}

impl FileKeyable for CaseSolution {
    fn key() -> crate::FileKey {
        ("DISPATCH".into(), "CASESOLUTION".into(), 1)
    }
}

impl GetFromRawAemo for CaseSolution {
    type Output = Self;
}

#[derive(Deserialize, Serialize, Debug, Clone)]
struct DRegion {
    #[serde(deserialize_with = "crate::au_datetime_deserialize")]
    settlementdate: chrono::NaiveDateTime,
    runno: i32,
    regionid: String,
    intervention: i32,
    rrp: f64,
    eep: f64,
    rop: f64,
    apcflag: i32,
    marketsuspendedflag: i32,
    totaldemand: f64,
    demandforecast: f64,
    dispatchablegeneration: f64,
    dispatchableload: f64,
    netinterchange: f64,
    excessgeneration: f64,
    lower5mindispatch: Option<f64>,
    lower5minimport: Option<f64>,
    lower5minlocaldispatch: f64,
    lower5minlocalprice: Option<f64>,
    lower5minlocalreq: Option<f64>,
    lower5minprice: Option<f64>,
    lower5minreq: Option<f64>,
    lower5minsupplyprice: Option<f64>,
    lower60secdispatch: Option<f64>,
    lower60secimport: Option<f64>,
    lower60seclocaldispatch: f64,
    lower60seclocalprice: Option<f64>,
    lower60seclocalreq: Option<f64>,
    lower60secprice: Option<f64>,
    lower60secreq: Option<f64>,
    lower60secsupplyprice: Option<f64>,
    lower6secdispatch: Option<f64>,
    lower6secimport: Option<f64>,
    lower6seclocaldispatch: f64,
    lower6seclocalprice: Option<f64>,
    lower6seclocalreq: Option<f64>,
    lower6secprice: Option<f64>,
    lower6secreq: Option<f64>,
    lower6secsupplyprice: Option<f64>,
    raise5mindispatch: Option<f64>,
    raise5minimport: Option<f64>,
    raise5minlocaldispatch: f64,
    raise5minlocalprice: Option<f64>,
    raise5minlocalreq: Option<f64>,
    raise5minprice: Option<f64>,
    raise5minreq: Option<f64>,
    raise5minsupplyprice: Option<f64>,
    raise60secdispatch: Option<f64>,
    raise60secimport: Option<f64>,
    raise60seclocaldispatch: f64,
    raise60seclocalprice: Option<f64>,
    raise60seclocalreq: Option<f64>,
    raise60secprice: Option<f64>,
    raise60secreq: Option<f64>,
    raise60secsupplyprice: Option<f64>,
    raise6secdispatch: Option<f64>,
    raise6secimport: Option<f64>,
    raise6seclocaldispatch: f64,
    raise6seclocalprice: Option<f64>,
    raise6seclocalreq: Option<f64>,
    raise6secprice: Option<f64>,
    raise6secreq: Option<f64>,
    raise6secsupplyprice: Option<f64>,
    aggregatedispatcherror: f64,
    availablegeneration: f64,
    availableload: f64,
    initialsupply: f64,
    clearedsupply: f64,
    lowerregimport: Option<f64>,
    lowerreglocaldispatch: f64,
    lowerreglocalreq: Option<f64>,
    lowerregreq: Option<f64>,
    raiseregimport: Option<f64>,
    raisereglocaldispatch: f64,
    raisereglocalreq: Option<f64>,
    raiseregreq: Option<f64>,
    raise5minlocalviolation: Option<f64>,
    raisereglocalviolation: Option<f64>,
    raise60seclocalviolation: Option<f64>,
    raise6seclocalviolation: Option<f64>,
    lower5minlocalviolation: Option<f64>,
    lowerreglocalviolation: Option<f64>,
    lower60seclocalviolation: Option<f64>,
    lower6seclocalviolation: Option<f64>,
    raise5minviolation: Option<f64>,
    raiseregviolation: Option<f64>,
    raise60secviolation: Option<f64>,
    raise6secviolation: Option<f64>,
    lower5minviolation: Option<f64>,
    lowerregviolation: Option<f64>,
    lower60secviolation: Option<f64>,
    lower6secviolation: Option<f64>,
    raise6secrrp: f64,
    raise6secrop: f64,
    raise6secapcflag: i32,
    raise60secrrp: f64,
    raise60secrop: f64,
    raise60secapcflag: i32,
    raise5minrrp: f64,
    raise5minrop: f64,
    raise5minapcflag: i32,
    raiseregrrp: f64,
    raiseregrop: f64,
    raiseregapcflag: i32,
    lower6secrrp: f64,
    lower6secrop: f64,
    lower6secapcflag: i32,
    lower60secrrp: f64,
    lower60secrop: f64,
    lower60secapcflag: i32,
    lower5minrrp: f64,
    lower5minrop: f64,
    lower5minapcflag: i32,
    lowerregrrp: f64,
    lowerregrop: f64,
    lowerregapcflag: i32,
    raise6secactualavailability: f64,
    raise60secactualavailability: f64,
    raise5minactualavailability: f64,
    raiseregactualavailability: f64,
    lower6secactualavailability: f64,
    lower60secactualavailability: f64,
    lower5minactualavailability: f64,
    lowerregactualavailability: f64,
    lorsurplus: Option<f64>,
    lrcsurplus: Option<f64>,
}

impl FileKeyable for DRegion {
    fn key() -> crate::FileKey {
        ("DREGION".into(), "".into(), 3)
    }
}

impl GetFromRawAemo for DRegion {
    type Output = Self;
}

#[derive(Deserialize, Serialize, Debug, Clone)]
struct DUnit {
    #[serde(deserialize_with = "crate::au_datetime_deserialize")]
    settlementdate: chrono::NaiveDateTime,
    runno: i32,
    duid: String,
    intervention: i32,
    dispatchmode: i32,
    agcstatus: i32,
    initialmw: f64,
    totalcleared: f64,
    rampdownrate: f64,
    rampuprate: f64,
    lower5min: f64,
    lower60sec: f64,
    lower6sec: f64,
    raise5min: f64,
    raise60sec: f64,
    raise6sec: f64,
    marginal5minvalue: Option<f64>,
    marginal60secvalue: Option<f64>,
    marginal6secvalue: Option<f64>,
    marginalvalue: Option<f64>,
    violation5mindegree: Option<f64>,
    violation60secdegree: Option<f64>,
    violation6secdegree: Option<f64>,
    violationdegree: Option<f64>,
    lowerreg: f64,
    raisereg: f64,
    availability: f64,
    raise6secflags: i32,
    raise60secflags: i32,
    raise5minflags: i32,
    raiseregflags: i32,
    lower6secflags: i32,
    lower60secflags: i32,
    lower5minflags: i32,
    lowerregflags: i32,
    raiseregavailability: f64,
    raiseregenablementmax: f64,
    raiseregenablementmin: f64,
    lowerregavailability: f64,
    lowerregenablementmax: f64,
    lowerregenablementmin: f64,
    raise6secactualavailability: f64,
    raise60secactualavailability: f64,
    raise5minactualavailability: f64,
    raiseregactualavailability: f64,
    lower6secactualavailability: f64,
    lower60secactualavailability: f64,
    lower5minactualavailability: f64,
    lowerregactualavailability: f64,
    semidispatchcap: i32,
}

impl FileKeyable for DUnit {
    fn key() -> crate::FileKey {
        ("DUNIT".into(), "".into(), 3)
    }
}

impl GetFromRawAemo for DUnit {
    type Output = Self;
}

#[derive(Deserialize, Serialize, Debug, Clone)]
struct RegionFcasRequirement {
    #[serde(deserialize_with = "crate::au_datetime_deserialize")]
    settlementdate: chrono::NaiveDateTime,
    runno: i32,
    intervention: i32,
    genconid: String,
    regionid: String,
    bidtype: String,
    #[serde(deserialize_with = "crate::au_datetime_deserialize")]
    genconeffectivedate: chrono::NaiveDateTime,
    genconversionno: i32,
    marginalvalue: f64,
    #[serde(deserialize_with = "crate::au_datetime_deserialize")]
    lastchanged: chrono::NaiveDateTime,
}

impl FileKeyable for RegionFcasRequirement {
    fn key() -> crate::FileKey {
        ("DISPATCH".into(), "REGIONFCASREQUIREMENT".into(), 1)
    }
}

impl GetFromRawAemo for RegionFcasRequirement {
    type Output = Self;
}

#[derive(Deserialize, Serialize, Debug, Clone)]
struct TRegion {
    #[serde(deserialize_with = "crate::au_datetime_deserialize")]
    settlementdate: chrono::NaiveDateTime,
    runno: i32,
    regionid: String,
    rrp: f64,
    eep: f64,
    invalidflag: String,
    totaldemand: f64,
    demandforecast: f64,
    dispatchablegeneration: f64,
    dispatchableload: f64,
    netinterchange: f64,
    excessgeneration: f64,
    lower5mindispatch: Option<f64>,
    lower5minimport: Option<f64>,
    lower5minlocaldispatch: f64,
    lower5minlocalprice: Option<f64>,
    lower5minlocalreq: Option<f64>,
    lower5minprice: Option<f64>,
    lower5minreq: Option<f64>,
    lower5minsupplyprice: Option<f64>,
    lower60secdispatch: Option<f64>,
    lower60secimport: Option<f64>,
    lower60seclocaldispatch: f64,
    lower60seclocalprice: Option<f64>,
    lower60seclocalreq: Option<f64>,
    lower60secprice: Option<f64>,
    lower60secreq: Option<f64>,
    lower60secsupplyprice: Option<f64>,
    lower6secdispatch: Option<f64>,
    lower6secimport: Option<f64>,
    lower6seclocaldispatch: f64,
    lower6seclocalprice: Option<f64>,
    lower6seclocalreq: Option<f64>,
    lower6secprice: Option<f64>,
    lower6secreq: Option<f64>,
    lower6secsupplyprice: Option<f64>,
    raise5mindispatch: Option<f64>,
    raise5minimport: Option<f64>,
    raise5minlocaldispatch: f64,
    raise5minlocalprice: Option<f64>,
    raise5minlocalreq: Option<f64>,
    raise5minprice: Option<f64>,
    raise5minreq: Option<f64>,
    raise5minsupplyprice: Option<f64>,
    raise60secdispatch: Option<f64>,
    raise60secimport: Option<f64>,
    raise60seclocaldispatch: f64,
    raise60seclocalprice: Option<f64>,
    raise60seclocalreq: Option<f64>,
    raise60secprice: Option<f64>,
    raise60secreq: Option<f64>,
    raise60secsupplyprice: Option<f64>,
    raise6secdispatch: Option<f64>,
    raise6secimport: Option<f64>,
    raise6seclocaldispatch: f64,
    raise6seclocalprice: Option<f64>,
    raise6seclocalreq: Option<f64>,
    raise6secprice: Option<f64>,
    raise6secreq: Option<f64>,
    raise6secsupplyprice: Option<f64>,
    availablegeneration: f64,
    availableload: f64,
    initialsupply: f64,
    clearedsupply: f64,
    lowerregimport: Option<f64>,
    lowerreglocaldispatch: f64,
    lowerreglocalreq: Option<f64>,
    lowerregreq: Option<f64>,
    raiseregimport: Option<f64>,
    raisereglocaldispatch: f64,
    raisereglocalreq: Option<f64>,
    raiseregreq: Option<f64>,
    raise5minlocalviolation: Option<f64>,
    raisereglocalviolation: Option<f64>,
    raise60seclocalviolation: Option<f64>,
    raise6seclocalviolation: Option<f64>,
    lower5minlocalviolation: Option<f64>,
    lowerreglocalviolation: Option<f64>,
    lower60seclocalviolation: Option<f64>,
    lower6seclocalviolation: Option<f64>,
    raise5minviolation: Option<f64>,
    raiseregviolation: Option<f64>,
    raise60secviolation: Option<f64>,
    raise6secviolation: Option<f64>,
    lower5minviolation: Option<f64>,
    lowerregviolation: Option<f64>,
    lower60secviolation: Option<f64>,
    lower6secviolation: Option<f64>,
    raise6secrrp: f64,
    raise60secrrp: f64,
    raise5minrrp: f64,
    raiseregrrp: f64,
    lower6secrrp: f64,
    lower60secrrp: f64,
    lower5minrrp: f64,
    lowerregrrp: f64,
}

impl FileKeyable for TRegion {
    fn key() -> crate::FileKey {
        ("TREGION".into(), "".into(), 2)
    }
}

impl GetFromRawAemo for TRegion {
    type Output = Self;
}

#[derive(Deserialize, Serialize, Debug, Clone)]
struct TUnit {
    #[serde(deserialize_with = "crate::au_datetime_deserialize")]
    settlementdate: chrono::NaiveDateTime,
    runno: i32,
    duid: String,
    initialmw: f64,
    totalcleared: f64,
    rampdownrate: f64,
    rampuprate: f64,
    lower5min: f64,
    lower60sec: f64,
    lower6sec: f64,
    raise5min: f64,
    raise60sec: f64,
    raise6sec: f64,
    lowerreg: f64,
    raisereg: f64,
    availability: f64,
}

impl FileKeyable for TUnit {
    fn key() -> crate::FileKey {
        ("TUNIT".into(), "".into(), 2)
    }
}

impl GetFromRawAemo for TUnit {
    type Output = Self;
}