use anyhow::Context; use serde::{Serialize, de::DeserializeOwned}; use crate::{CastBytes, Decode, Encode, EncodedResponse}; /// ```markdown /// | --- u8[] --- | /// | | /// ``` #[derive(Clone, Debug)] pub struct EncodedJsonMessage(Vec); impl_identity!(EncodedJsonMessage); impl CastBytes for EncodedJsonMessage { fn from_vec(vec: Vec) -> Self { Self(vec) } fn into_vec(self) -> Vec { self.0 } } pub struct JsonMessage<'a, T>(pub &'a T); impl<'a, T: Serialize + Send> Encode> for JsonMessage<'a, T> where &'a T: Send, { fn encode(self) -> anyhow::Result { serde_json::to_vec(self.0) .context("Failed to serialize data to bytes") .map(EncodedJsonMessage) } } impl Decode for EncodedJsonMessage { fn decode(self) -> anyhow::Result { serde_json::from_slice(&self.0) .context("Failed to parse JSON bytes") } } impl From for EncodedResponse { fn from(value: T) -> Self { serde_json::to_vec(&value) .map(EncodedJsonMessage::from_vec) .context("Failed to serialize data to bytes") .encode() } }