fnct/
format.rs

1//! Formatters are used to serialize and deserialize data for storing it in a
2//! cache.
3
4use std::fmt::Debug;
5
6use 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.
10pub 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)]
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/// A formatter using the [`serde_json`] crate.
45#[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}