use crate::model::Policy;
use std::fs::OpenOptions;
use std::io;
use std::io::{BufReader, BufWriter, Read, Write};
use std::path::PathBuf;
#[derive(Debug)]
pub enum Error {
ReadingFile(io::Error),
WritingFile(io::Error),
SerializingPolicy(String),
DeserializingJson(String),
InvalidPolicy,
}
pub fn read_from_file(path: &PathBuf) -> Result<Policy, Error> {
match OpenOptions::new().read(true).open(path) {
Ok(f) => read_from_reader(f),
Err(e) => Err(Error::ReadingFile(e)),
}
}
pub fn read_from_reader<R>(reader: R) -> Result<Policy, Error>
where
R: Read + Sized,
{
let reader = BufReader::new(reader);
match serde_json::from_reader(reader) {
Ok(policy) => Ok(policy),
Err(e) => Err(Error::DeserializingJson(e.to_string())),
}
}
pub fn read_from_string(s: &str) -> Result<Policy, Error> {
read_from_reader(s.as_bytes())
}
pub fn write_to_file(path: &PathBuf, policy: &Policy) -> Result<(), Error> {
match OpenOptions::new()
.write(true)
.create(true)
.truncate(true)
.open(path)
{
Ok(f) => write_to_writer(f, policy),
Err(e) => Err(Error::WritingFile(e)),
}
}
pub fn write_to_writer<W>(writer: W, policy: &Policy) -> Result<(), Error>
where
W: Write + Sized,
{
let writer = BufWriter::new(writer);
match serde_json::to_writer_pretty(writer, policy) {
Ok(_) => Ok(()),
Err(e) => Err(Error::SerializingPolicy(e.to_string())),
}
}