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}