serde_loader/
json.rs

1use crate::{
2    common::*,
3    file::{FileDumper, FileLoader, FilePath},
4};
5use fs::File;
6use io::{BufReader, BufWriter};
7
8pub type JsonPath<T> = FilePath<T, JsonDumper, JsonLoader>;
9pub type JsonPrettyPath<T> = FilePath<T, JsonDumperPretty, JsonLoader>;
10
11#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
12pub struct JsonDumper {
13    _private: [u8; 0],
14}
15
16impl<T> FileDumper<T> for JsonDumper
17where
18    T: Serialize,
19{
20    type Error = anyhow::Error;
21
22    fn dump<P>(p: P, value: &T) -> Result<(), Self::Error>
23    where
24        P: AsRef<Path>,
25    {
26        let mut writer = BufWriter::new(File::create(p)?);
27        serde_json::to_writer(&mut writer, value)?;
28        writer.flush()?;
29        Ok(())
30    }
31}
32
33#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
34pub struct JsonDumperPretty {
35    _private: [u8; 0],
36}
37
38impl<T> FileDumper<T> for JsonDumperPretty
39where
40    T: Serialize,
41{
42    type Error = anyhow::Error;
43
44    fn dump<P>(p: P, value: &T) -> Result<(), Self::Error>
45    where
46        P: AsRef<Path>,
47    {
48        let mut writer = BufWriter::new(File::create(p)?);
49        serde_json::to_writer_pretty(&mut writer, value)?;
50        writer.flush()?;
51        Ok(())
52    }
53}
54
55#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
56pub struct JsonLoader {
57    _private: [u8; 0],
58}
59
60impl<T> FileLoader<T> for JsonLoader
61where
62    T: DeserializeOwned,
63{
64    type Error = anyhow::Error;
65
66    fn load<P>(p: P) -> Result<T, Self::Error>
67    where
68        P: AsRef<Path>,
69    {
70        let reader = BufReader::new(File::open(p)?);
71        let value = serde_json::from_reader(reader)?;
72        Ok(value)
73    }
74}