use crate::{
Result, Run,
error::DeError,
types::{Comparison, SplitStatus, TimeType},
};
use std::io::{Read, Write};
use ron::{
Options,
de::from_reader,
ser::{PrettyConfig, to_string_pretty},
};
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct StateDump {
pub run: Run,
pub comparison: Comparison,
pub current_seg: usize,
pub rta: TimerDump,
pub igt: TimerDump,
pub igt_paused: bool,
}
impl StateDump {
pub fn from_reader(r: impl Read) -> Result<Self> {
let mut s: Self = from_reader(r).map_err(DeError::Ron)?;
s.run.verify()?;
s.run.normalize();
s.run.calc_avgs();
Ok(s)
}
pub fn to_string(&self) -> Result<String> {
Ok(to_string_pretty(self, PrettyConfig::new())?)
}
pub fn to_writer(&self, w: impl Write) -> Result<()> {
Ok(Options::default().to_io_writer_pretty(w, self, PrettyConfig::new())?)
}
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct TimerDump {
pub active_time: i128,
pub run_split_times: Vec<TimeType>,
pub run_seg_times: Vec<TimeType>,
pub run_pb_statuses: Vec<SplitStatus>,
pub run_gold_statuses: Vec<SplitStatus>,
pub run_avg_statuses: Vec<SplitStatus>,
pub run_pb_diffs: Vec<TimeType>,
pub run_pb_seg_diffs: Vec<TimeType>,
pub run_gold_diffs: Vec<TimeType>,
pub run_gold_seg_diffs: Vec<TimeType>,
pub run_avg_diffs: Vec<TimeType>,
pub run_avg_seg_diffs: Vec<TimeType>,
pub avg_split_times: Vec<TimeType>,
}