AppFlowy/frontend/rust-lib/lib-dispatch/src/byte_trait.rs

69 lines
1.8 KiB
Rust
Raw Normal View History

use crate::errors::{DispatchError, InternalError};
2021-08-20 14:00:03 +00:00
use bytes::Bytes;
2021-07-11 09:38:03 +00:00
// To bytes
pub trait ToBytes {
fn into_bytes(self) -> Result<Bytes, DispatchError>;
2021-07-11 09:38:03 +00:00
}
#[cfg(feature = "use_protobuf")]
impl<T> ToBytes for T
where
T: std::convert::TryInto<Bytes, Error = protobuf::ProtobufError>,
2021-07-11 09:38:03 +00:00
{
fn into_bytes(self) -> Result<Bytes, DispatchError> {
match self.try_into() {
Ok(data) => Ok(data),
2022-02-24 13:49:18 +00:00
Err(e) => Err(InternalError::ProtobufError(format!("{:?}", e)).into()),
}
}
2021-07-11 09:38:03 +00:00
}
#[cfg(feature = "use_serde")]
impl<T> ToBytes for T
where
T: serde::Serialize,
{
fn into_bytes(self) -> Result<Bytes, DispatchError> {
2021-07-11 09:38:03 +00:00
match serde_json::to_string(&self.0) {
2021-08-20 14:00:03 +00:00
Ok(s) => Ok(Bytes::from(s)),
Err(e) => Err(InternalError::SerializeToBytes(format!("{:?}", e)).into()),
2021-07-11 09:38:03 +00:00
}
}
}
// From bytes
pub trait FromBytes: Sized {
fn parse_from_bytes(bytes: Bytes) -> Result<Self, DispatchError>;
2021-07-11 09:38:03 +00:00
}
#[cfg(feature = "use_protobuf")]
impl<T> FromBytes for T
where
2021-08-21 04:34:11 +00:00
// // https://stackoverflow.com/questions/62871045/tryfromu8-trait-bound-in-trait
// T: for<'a> std::convert::TryFrom<&'a Bytes, Error =
// protobuf::ProtobufError>,
T: std::convert::TryFrom<Bytes, Error = protobuf::ProtobufError>,
2021-07-11 09:38:03 +00:00
{
fn parse_from_bytes(bytes: Bytes) -> Result<Self, DispatchError> {
2021-11-27 11:19:41 +00:00
let data = T::try_from(bytes)?;
Ok(data)
}
2021-07-11 09:38:03 +00:00
}
#[cfg(feature = "use_serde")]
impl<T> FromBytes for T
where
T: serde::de::DeserializeOwned + 'static,
{
2021-08-20 14:00:03 +00:00
fn parse_from_bytes(bytes: Bytes) -> Result<Self, String> {
let s = String::from_utf8_lossy(&bytes);
2021-07-11 09:38:03 +00:00
match serde_json::from_str::<T>(s.as_ref()) {
Ok(data) => Ok(data),
Err(e) => Err(format!("{:?}", e)),
}
}
}