dodo/serializer/
json.rs

1//! Json Serializer (using [Serde](https://docs.serde.rs/serde_json/)).
2
3use std::io;
4
5use serde::{de::DeserializeOwned, Serialize};
6
7use super::{Result, Serializer, SerializerError};
8
9/// JSON serializer (using [Serde](https://docs.serde.rs/serde_json/)).
10///
11/// # Examples
12///
13/// ```
14/// use dodo::prelude::*;
15/// # use serde::{Deserialize, Serialize};
16/// # use uuid::Uuid;
17/// #
18/// # #[derive(Debug, Entity, Serialize, Deserialize, Eq, PartialEq)]
19/// # #[serde(rename_all = "camelCase")]
20/// # struct Person { id: Option<Uuid>, name: String, age: u64 }
21/// #
22/// # impl Person {
23/// #    fn with_age(age : u64) -> Self { Self { id : None, name : "John Smith".into(), age }}
24/// # }
25///
26/// type PersonCollection = Collection<Person, Directory, JsonSerializer>;
27///
28/// fn main() -> Result<(), Box<dyn std::error::Error>> {
29/// #   let path  = tempfile::tempdir()?;
30///     let directory = Directory::new(&path)?;
31///     let mut collection = PersonCollection::new(directory);
32///     Ok(())
33/// }
34/// ```
35#[derive(Debug, Clone)]
36pub struct JsonSerializer;
37
38impl Serializer for JsonSerializer {
39    fn serialize<T, W>(mut writer: W, value: &T) -> Result<()>
40        where T: Serialize + DeserializeOwned,
41              W: io::Write {
42        serde_json::to_writer(&mut writer, value)?;
43        writer.flush().map_err(From::from)
44    }
45
46    fn deserialize<T, R>(reader: R) -> Result<T>
47        where T: Serialize + DeserializeOwned,
48              R: io::Read {
49        serde_json::from_reader(reader).map_err(From::from)
50    }
51}
52
53impl From<serde_json::Error> for SerializerError {
54    fn from(error: serde_json::Error) -> Self {
55        use serde_json::error::Category;
56        match error.classify() {
57            Category::Syntax | Category::Data => Self::syntax(error),
58            Category::Io | Category::Eof => Self::io(error)
59        }
60    }
61}