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 }