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}