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}