use std::error::Error;
use std::io;
use serde::{de::DeserializeOwned, Serialize};
use super::{Result, Serializer, SerializerError};
#[derive(Debug, Clone)]
pub struct YamlSerializer;
impl Serializer for YamlSerializer {
fn serialize<T, W>(mut writer: W, value: &T) -> Result<()>
where T: Serialize + DeserializeOwned,
W: io::Write {
serde_yaml::to_writer(&mut writer, value)?;
writer.flush().map_err(From::from)
}
fn deserialize<T, R>(reader: R) -> Result<T>
where T: Serialize + DeserializeOwned,
R: io::Read {
serde_yaml::from_reader(reader).map_err(From::from)
}
}
impl From<serde_yaml::Error> for SerializerError {
fn from(error: serde_yaml::Error) -> Self {
match error.source() {
Some(e) => {
if e.is::<io::Error>() {
Self::io(error)
} else {
Self::syntax(error)
}
}
None => Self::other(error)
}
}
}