1use std::fmt::Display;
6use std::marker::PhantomData;
7
8use anyhow::anyhow;
9#[cfg(feature = "serde-prost")]
10use prost::bytes::Bytes;
11#[cfg(feature = "serde-json")]
12use serde::{Deserialize, Serialize};
13
14pub trait Serializer<T>: Send + Sync {
17 fn serialize(&self, value: T) -> anyhow::Result<Vec<u8>>;
24}
25
26pub trait Deserializer<T>: Send + Sync {
29 fn deserialize(&self, data: &[u8]) -> anyhow::Result<T>;
37}
38
39pub trait Serde<T>: Serializer<T> + Deserializer<T> + Send + Sync {}
42
43impl<S, T> Serde<T> for S where S: Serializer<T> + Deserializer<T> {}
44
45#[derive(Clone, Copy)]
49pub struct Convert<In, Out, S>
50where
51 In: Send + Sync,
52 Out: Send + Sync,
53 S: Serde<Out> + Send + Sync,
54{
55 serde: S,
56 inn: PhantomData<In>,
57 out: PhantomData<Out>,
58}
59
60impl<In, Out, S> Convert<In, Out, S>
61where
62 In: Send + Sync,
63 Out: Send + Sync,
64 S: Serde<Out> + Send + Sync,
65{
66 pub fn new(serde: S) -> Self {
68 Self {
69 serde,
70 inn: PhantomData,
71 out: PhantomData,
72 }
73 }
74}
75
76impl<In, Out, S> Serializer<In> for Convert<In, Out, S>
77where
78 In: TryFrom<Out> + Send + Sync,
79 Out: TryFrom<In> + Send + Sync,
80 <Out as TryFrom<In>>::Error: Display,
81 S: Serde<Out> + Send + Sync,
82{
83 fn serialize(&self, value: In) -> anyhow::Result<Vec<u8>> {
84 self.serde.serialize(
85 value
86 .try_into()
87 .map_err(|err| anyhow!("failed to convert type values: {}", err))?,
88 )
89 }
90}
91
92impl<In, Out, S> Deserializer<In> for Convert<In, Out, S>
93where
94 In: TryFrom<Out> + Send + Sync,
95 Out: TryFrom<In> + Send + Sync,
96 <In as TryFrom<Out>>::Error: Display,
97 S: Serde<Out> + Send + Sync,
98{
99 fn deserialize(&self, data: &[u8]) -> anyhow::Result<In> {
100 let inn = self.serde.deserialize(data)?;
101
102 inn.try_into()
103 .map_err(|err| anyhow!("failed to convert type values: {}", err))
104 }
105}
106
107#[cfg(feature = "serde-json")]
110#[derive(Debug, Clone, Copy)]
111pub struct Json<T>(PhantomData<T>)
112where
113 T: Serialize + Send + Sync,
114 for<'d> T: Deserialize<'d>;
115
116#[cfg(feature = "serde-json")]
117impl<T> Default for Json<T>
118where
119 T: Serialize + Send + Sync,
120 for<'d> T: Deserialize<'d>,
121{
122 fn default() -> Self {
123 Self(PhantomData)
124 }
125}
126
127#[cfg(feature = "serde-json")]
128impl<T> Serializer<T> for Json<T>
129where
130 T: Serialize + Send + Sync,
131 for<'d> T: Deserialize<'d>,
132{
133 fn serialize(&self, value: T) -> anyhow::Result<Vec<u8>> {
134 serde_json::to_vec(&value)
135 .map_err(|err| anyhow!("failed to serialize value to json: {}", err))
136 }
137}
138
139#[cfg(feature = "serde-json")]
140impl<T> Deserializer<T> for Json<T>
141where
142 T: Serialize + Send + Sync,
143 for<'d> T: Deserialize<'d>,
144{
145 fn deserialize(&self, data: &[u8]) -> anyhow::Result<T> {
146 serde_json::from_slice(data)
147 .map_err(|err| anyhow!("failed to deserialize value from json: {}", err))
148 }
149}
150
151#[cfg(feature = "serde-prost")]
154#[derive(Debug, Clone, Copy, Default)]
155pub struct Protobuf<T>(PhantomData<T>)
156where
157 T: prost::Message + Default;
158
159#[cfg(feature = "serde-prost")]
160impl<T> Serializer<T> for Protobuf<T>
161where
162 T: prost::Message + Default,
163{
164 fn serialize(&self, value: T) -> anyhow::Result<Vec<u8>> {
165 Ok(value.encode_to_vec())
166 }
167}
168
169#[cfg(feature = "serde-prost")]
170impl<T> Deserializer<T> for Protobuf<T>
171where
172 T: prost::Message + Default,
173{
174 fn deserialize(&self, data: &[u8]) -> anyhow::Result<T> {
175 let buf = Bytes::copy_from_slice(data);
176
177 T::decode(buf)
178 .map_err(|err| anyhow!("failed to deserialize protobuf message into value: {}", err))
179 }
180}
181
182#[cfg(feature = "serde-prost")]
185#[cfg(feature = "serde-json")]
186#[derive(Clone, Copy, Default)]
187pub struct ProtoJson<T>(PhantomData<T>)
188where
189 T: prost::Message + Serialize + Default,
190 for<'de> T: Deserialize<'de>;
191
192#[cfg(feature = "serde-prost")]
193#[cfg(feature = "serde-json")]
194impl<T> Serializer<T> for ProtoJson<T>
195where
196 T: prost::Message + Serialize + Default,
197 for<'de> T: Deserialize<'de>,
198{
199 fn serialize(&self, value: T) -> anyhow::Result<Vec<u8>> {
200 Json::<T>::default().serialize(value)
201 }
202}
203
204#[cfg(feature = "serde-prost")]
205#[cfg(feature = "serde-json")]
206impl<T> Deserializer<T> for ProtoJson<T>
207where
208 T: prost::Message + Serialize + Default,
209 for<'de> T: Deserialize<'de>,
210{
211 fn deserialize(&self, data: &[u8]) -> anyhow::Result<T> {
212 Json::<T>::default().deserialize(data)
213 }
214}