use std::io::{
Read,
Write,
};
use serde::{
Serialize,
de::DeserializeSeed,
};
use crate::error::Error;
pub trait Format {
fn extension() -> &'static str {
".sav"
}
fn serialize<W: Write, T: Serialize>(writer: W, value: &T) -> Result<(), Error>;
fn deserialize<R: Read, S: for<'de> DeserializeSeed<'de, Value = T>, T>(
reader: R,
seed: S,
) -> Result<T, Error>;
}
pub struct RMPFormat;
impl Format for RMPFormat {
fn extension() -> &'static str {
".mp"
}
fn serialize<W: Write, T: Serialize>(writer: W, value: &T) -> Result<(), Error> {
let mut ser = rmp_serde::Serializer::new(writer);
value.serialize(&mut ser).map_err(Error::saving)
}
fn deserialize<R: Read, S: for<'de> DeserializeSeed<'de, Value = T>, T>(
reader: R,
seed: S,
) -> Result<T, Error> {
let mut de = rmp_serde::Deserializer::new(reader);
seed.deserialize(&mut de).map_err(Error::loading)
}
}
pub struct JSONFormat;
impl Format for JSONFormat {
fn extension() -> &'static str {
".json"
}
fn serialize<W: Write, T: Serialize>(writer: W, value: &T) -> Result<(), Error> {
let mut ser = serde_json::Serializer::pretty(writer);
value.serialize(&mut ser).map_err(Error::saving)
}
fn deserialize<R: Read, S: for<'de> DeserializeSeed<'de, Value = T>, T>(
reader: R,
seed: S,
) -> Result<T, Error> {
let mut de = serde_json::Deserializer::from_reader(reader);
seed.deserialize(&mut de).map_err(Error::loading)
}
}
pub type DefaultFormat = RMPFormat;
pub type DefaultDebugFormat = JSONFormat;