/ fnct / src / format.rs
format.rs
 1  //! Formatters are used to serialize and deserialize data for storing it in a
 2  //! cache.
 3  
 4  use std::fmt::Debug;
 5  
 6  use serde::{de::DeserializeOwned, Serialize};
 7  
 8  /// A formatter that can serialize data before storing it in a cache and
 9  /// deserialize it after retrieving it from the cache.
10  pub trait Formatter: Debug {
11      /// The unique identifier of this formatter.
12      const ID: &'static str;
13  
14      /// The error to return if serialization or deserialization fails.
15      type Error: std::error::Error;
16      /// The type of serialized data.
17      type Serialized;
18  
19      /// Serialize a `T` and return a [`Self::Serialized`].
20      fn serialize<T: Serialize>(&self, value: &T) -> Result<Self::Serialized, Self::Error>;
21      /// Deserialize a [`Self::Serialized`] and return a `T`.
22      fn deserialize<T: DeserializeOwned>(&self, value: &Self::Serialized) -> Result<T, Self::Error>;
23  }
24  
25  /// A formatter using the [`postcard`] crate.
26  #[derive(Debug, Clone, Copy, Default)]
27  pub struct PostcardFormatter;
28  
29  impl 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  /// A formatter using the [`serde_json`] crate.
45  #[cfg(feature = "serde_json")]
46  #[derive(Debug, Clone, Copy, Default)]
47  pub struct JsonFormatter;
48  
49  #[cfg(feature = "serde_json")]
50  impl 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  }