ecksport_codec/
serde_cbor_wrap.rs

1//! Wrapper for Serde types as CBOR.
2
3use serde::{de::DeserializeOwned, Serialize};
4
5use crate::errors::CodecError;
6use crate::traits::RpcCodec;
7
8/// Wrapper type to expose a `borsh`-serializable type in an RPC.
9#[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd)]
10pub struct AsSerdeCbor<T: DeserializeOwned + Serialize>(T);
11
12impl<T: DeserializeOwned + Serialize> AsSerdeCbor<T> {
13    pub fn new(v: T) -> Self {
14        Self(v)
15    }
16
17    pub fn inner(&self) -> &T {
18        &self.0
19    }
20
21    pub fn inner_mut(&mut self) -> &mut T {
22        &mut self.0
23    }
24
25    pub fn into_inner(self) -> T {
26        self.0
27    }
28}
29
30impl<T: DeserializeOwned + Serialize> From<T> for AsSerdeCbor<T> {
31    fn from(value: T) -> Self {
32        Self::new(value)
33    }
34}
35
36impl<T: DeserializeOwned + Serialize> RpcCodec for AsSerdeCbor<T> {
37    fn from_slice(buf: &[u8]) -> Result<Self, CodecError> {
38        let v = serde_cbor::from_slice::<T>(buf).map_err(CodecError::SerdeCbor)?;
39        Ok(Self(v))
40    }
41
42    fn fill_buf(&self, buf: &mut Vec<u8>) -> Result<(), CodecError> {
43        serde_cbor::to_writer(buf, &self.0).map_err(CodecError::SerdeCbor)?;
44        Ok(())
45    }
46}