1use std::fmt::Debug;
5
6use serde::{de::DeserializeOwned, Serialize};
7
8pub trait Formatter: Debug {
11 const ID: &'static str;
13
14 type Error: std::error::Error;
16 type Serialized;
18
19 fn serialize<T: Serialize>(&self, value: &T) -> Result<Self::Serialized, Self::Error>;
21 fn deserialize<T: DeserializeOwned>(&self, value: &Self::Serialized) -> Result<T, Self::Error>;
23}
24
25#[derive(Debug, Clone, Copy, Default)]
27pub struct PostcardFormatter;
28
29impl Formatter for PostcardFormatter {
30 const ID: &'static str = "postcard";
31
32 type Error = postcard::Error;
33 type Serialized = Vec<u8>;
34
35 fn serialize<T: Serialize>(&self, value: &T) -> Result<Self::Serialized, Self::Error> {
36 postcard::to_stdvec(value)
37 }
38
39 fn deserialize<T: DeserializeOwned>(&self, value: &Self::Serialized) -> Result<T, Self::Error> {
40 postcard::from_bytes(value)
41 }
42}
43
44#[cfg(feature = "serde_json")]
46#[derive(Debug, Clone, Copy, Default)]
47pub struct JsonFormatter;
48
49#[cfg(feature = "serde_json")]
50impl Formatter for JsonFormatter {
51 const ID: &'static str = "json";
52
53 type Error = serde_json::Error;
54 type Serialized = String;
55
56 fn serialize<T: Serialize>(&self, value: &T) -> Result<Self::Serialized, Self::Error> {
57 serde_json::to_string(value)
58 }
59
60 fn deserialize<T: DeserializeOwned>(&self, value: &Self::Serialized) -> Result<T, Self::Error> {
61 serde_json::from_str(value)
62 }
63}