pub mod auroras_additions;
pub mod collab_utils2;
use std::{fmt::Write, io::Read};
use saphyr::{YAMLDecodingTrap, Yaml, YamlDecoder, YamlEmitter, YamlLoader};
use crate::saves::mods::{
auroras_additions::AurorasAdditionsSave,
collab_utils2::CollabsUtils2Save,
};
pub trait ModFile: Sized {
const MOD_NAME: &'static str;
fn parse_from_yaml(yaml: Yaml) -> anyhow::Result<Self>;
fn parse_from_str(str: &str) -> anyhow::Result<Self> {
let yaml = YamlLoader::load_from_str(str)?;
Self::parse_from_yaml(yaml[0].clone())
}
fn parse_from_reader(reader: impl Read) -> anyhow::Result<Self> {
let yaml = YamlDecoder::read(reader)
.encoding_trap(YAMLDecodingTrap::Strict)
.decode();
match yaml {
Ok(y) => Self::parse_from_yaml(y[0].clone()),
Err(e) => match e {
saphyr::yaml::LoadError::IO(e) => Err(Box::new(e).into()),
saphyr::yaml::LoadError::Scan(e) => Err(Box::new(e).into()),
saphyr::yaml::LoadError::Decode(e) => Err(anyhow::format_err!(e)),
},
}
}
fn to_yaml(&self) -> anyhow::Result<Yaml>;
fn to_writer(&self, writer: &mut impl Write) -> anyhow::Result<()> {
let yaml = self.to_yaml()?;
let mut emitter = YamlEmitter::new(writer);
emitter.multiline_strings(true);
Ok(emitter.dump(&yaml)?)
}
}
pub trait ModSave: ModFile {}
pub trait ModSession: ModFile {}
pub trait ModSettings: ModFile {}
pub struct DynYamlDoc(pub String, pub Yaml);
#[allow(clippy::large_enum_variant)]
pub enum ParsedModSave {
AurorasAdditions(AurorasAdditionsSave),
CollabUtils2(CollabsUtils2Save),
Unknown(DynYamlDoc),
}
#[allow(clippy::large_enum_variant)]
pub enum ParsedModSession {
Unknown(DynYamlDoc),
}
#[allow(clippy::large_enum_variant)]
pub enum ParsedModSetting {
Unknown(DynYamlDoc),
}