serde_loader/
yaml.rs

1use crate::{
2    file::{FileDumper, FileLoader},
3    FilePath,
4};
5use serde::{Deserialize, Serialize};
6use std::{
7    fs::File,
8    io::{BufReader, BufWriter},
9    path::Path,
10};
11
12pub type YamlPath<T> = FilePath<T, YamlDumper, YamlLoader>;
13
14#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
15pub struct YamlDumper {
16    _private: [u8; 0],
17}
18
19impl<T> FileDumper<T> for YamlDumper
20where
21    T: Serialize,
22{
23    type Error = anyhow::Error;
24
25    fn dump<P>(p: P, value: &T) -> Result<(), Self::Error>
26    where
27        P: AsRef<Path>,
28    {
29        let writer = BufWriter::new(File::create(p)?);
30        serde_yaml::to_writer(writer, value)?;
31        Ok(())
32    }
33}
34
35#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
36pub struct YamlLoader {
37    _private: [u8; 0],
38}
39
40impl<T> FileLoader<T> for YamlLoader
41where
42    T: for<'de> Deserialize<'de>,
43{
44    type Error = anyhow::Error;
45
46    fn load<P>(p: P) -> Result<T, Self::Error>
47    where
48        P: AsRef<Path>,
49    {
50        let reader = BufReader::new(File::open(p)?);
51        let value: T = serde_yaml::from_reader(reader)?;
52        Ok(value)
53    }
54}