#[cfg(feature = "json")]
pub mod featured {
use crate::Error;
use serde::{Deserialize, Serialize};
use std::fs::{read_to_string, write};
use std::io::Write;
pub trait FromJson<'de>: Deserialize<'de> {
fn from_json_file(filename: &str) -> Result<Self, Error> {
read_to_string(filename)
.map_err(Error::FileError)
.and_then(|text| <Self as FromJson>::from_json_string(&text))
}
fn from_json_string(text: &str) -> Result<Self, Error> {
serde_json::from_str(text).map_err(|error| Error::SerdeError(error.to_string()))
}
}
pub trait ToJson: Serialize {
fn write_json<W>(&self, writer: W) -> Result<(), Error>
where
W: Write,
{
serde_json::to_writer(writer, self)
.map_err(|error| Error::SerdeError(error.to_string()))
}
fn write_json_pretty<W>(&self, writer: W) -> Result<(), Error>
where
W: Write,
{
serde_json::to_writer_pretty(writer, self)
.map_err(|error| Error::SerdeError(error.to_string()))
}
fn to_json(&self) -> Result<String, Error> {
serde_json::to_string(self).map_err(|error| Error::SerdeError(error.to_string()))
}
fn write_to_json_file(&self, filename: &str) -> Result<(), Error> {
write(filename, <Self as ToJson>::to_json(self)?).map_err(Error::FileError)
}
}
}