prettylogger/
json.rs

1use std::{
2    fs::{
3        File,
4        read_to_string
5    },
6    io::Write,
7};
8
9use crate::{
10    Logger,
11    Error
12};
13
14impl Logger {
15    /// Creates a `Logger` instance from a JSON template as string.
16    ///
17    /// # Examples
18    ///
19    /// Deserializing `Logger` from a JSON string:
20    /// ```
21    /// # use prettylogger::Logger;
22    /// let pretty_json = serde_json::to_string_pretty(&Logger::default())
23    ///     .expect("Failed to serialize logger!");
24    ///
25    /// let mut logger = Logger::from_template_str(&pretty_json)
26    ///     .expect("Failed to deserialize logger!");
27    /// # let raw_json = serde_json::to_string(&Logger::default())
28    /// #    .expect("Failed to serialize logger!");
29    /// # assert_eq!(Logger::default(), Logger::from_template_str(&pretty_json)
30    /// #    .expect("Failed to deserialize logger!"));
31    /// # assert_eq!(Logger::default(), Logger::from_template_str(&raw_json)
32    /// #    .expect("Failed to deserialize logger!"));
33    /// ```
34    pub fn from_template_str(template: &str) -> Result<Logger, Error> {
35        let result: Result<Logger, serde_json::Error>
36            = serde_json::from_str(template);
37        match result {
38            Ok(logger) => {
39                Ok(logger)
40            },
41            Err(e) => Err(Error::new(&e.to_string()))
42        }
43    }
44
45    /// Creates a `Logger` instance from a template file.
46    ///
47    /// # Examples
48    ///
49    /// Deserializing `Logger` from a JSON file:
50    /// ```
51    /// # use prettylogger::Logger;
52    /// # let mut path = std::env::temp_dir();
53    /// # path.push("libprettylogger-tests/from-template.json");
54    /// # let path = &path.to_str().unwrap().to_string();
55    /// # Logger::default().save_template(path);
56    /// let mut logger = Logger::from_template(path)
57    ///     .expect("Failed to deserialize logger!");
58    /// # assert_eq!(Logger::default(), logger);
59    /// ```
60    pub fn from_template(path: &str) -> Result<Logger, Error> {
61        match read_to_string(path) {
62            Ok(contents) => {
63                Logger::from_template_str(&contents)
64            },
65            Err(e) => Err(Error::new(&e.to_string()))
66        }
67    }
68
69    /// Saves a `Logger` instance to template file.
70    ///
71    /// # Examples
72    ///
73    /// Serializing a `Logger` instance to a file:
74    /// ```
75    /// # use prettylogger::Logger;
76    /// # let mut path = std::env::temp_dir();
77    /// # path.push("libprettylogger-tests/from-template.json");
78    /// # let path = &path.to_str().unwrap().to_string();
79    /// let mut logger = Logger::default();
80    /// logger.save_template(path);
81    /// # assert_eq!(Logger::from_template(path)
82    ///     .expect("Failed to deserialize logger!"), Logger::default());
83    /// ```
84    pub fn save_template(&self, path: &str) -> Result<(), Error> {
85        let json = serde_json::to_string_pretty(self);
86        match json {
87            Ok(json) => {
88                match File::create(path) {
89                    Ok(mut file) => {
90                        match file.write_all(json.as_bytes()) {
91                            Ok(_) => Ok(()),
92                            Err(e) => {
93                                Err(Error::new(&e.to_string()))
94                            }
95                        }
96                    },
97                    Err(e) => Err(Error::new(&e.to_string()))
98                }
99            },
100            Err(e) => Err(Error::new(&e.to_string()))
101        }
102    }
103}