use serde::{Deserialize, Deserializer, Serialize, de::DeserializeOwned};
use std::{
error::Error,
fmt,
io::{Read, Write},
sync::Arc,
};
pub type ArcError = Arc<dyn Error + Send + Sync + 'static>;
#[derive(Debug, Clone)]
pub(crate) struct ErrorMsg(pub String);
impl fmt::Display for ErrorMsg {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", &self.0)
}
}
impl Error for ErrorMsg {}
#[derive(Debug, Clone)]
pub struct StreamingUnavailable;
impl fmt::Display for StreamingUnavailable {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "streaming serialization and deserialization is unavailable")
}
}
impl Error for StreamingUnavailable {}
#[derive(Debug, Clone)]
pub struct SerializationError(pub ArcError);
impl SerializationError {
pub fn new<E>(err: E) -> Self
where
E: Error + Send + Sync + 'static,
{
Self(Arc::new(err))
}
}
impl fmt::Display for SerializationError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", &self.0)
}
}
impl Error for SerializationError {}
impl Serialize for SerializationError {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
let msg = self.0.to_string();
msg.serialize(serializer)
}
}
impl<'de> Deserialize<'de> for SerializationError {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let msg = String::deserialize(deserializer)?;
Ok(Self::new(ErrorMsg(msg)))
}
}
#[derive(Debug, Clone)]
pub struct DeserializationError(pub ArcError);
impl DeserializationError {
pub fn new<E>(err: E) -> Self
where
E: Error + Send + Sync + 'static,
{
Self(Arc::new(err))
}
}
impl fmt::Display for DeserializationError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", &self.0)
}
}
impl Error for DeserializationError {}
impl Serialize for DeserializationError {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
let msg = self.0.to_string();
msg.serialize(serializer)
}
}
impl<'de> Deserialize<'de> for DeserializationError {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let msg = String::deserialize(deserializer)?;
Ok(Self::new(ErrorMsg(msg)))
}
}
pub trait Codec: Send + Sync + Serialize + for<'de> Deserialize<'de> + Clone + Unpin + 'static {
fn serialize<Writer, Item>(writer: Writer, item: &Item) -> Result<(), SerializationError>
where
Writer: Write,
Item: Serialize;
fn deserialize<Reader, Item>(reader: Reader) -> Result<Item, DeserializationError>
where
Reader: Read,
Item: DeserializeOwned;
}
#[cfg(feature = "codec-json")]
pub mod map;
#[cfg(feature = "codec-postbag")]
mod postbag;
#[cfg(feature = "default-codec-postbag")]
#[doc(no_inline)]
pub use postbag::Postbag as Default;
#[cfg(feature = "default-codec-postbag-slim")]
#[doc(no_inline)]
pub use postbag::PostbagSlim as Default;
#[cfg(feature = "codec-postbag")]
pub use postbag::{Postbag, PostbagSlim};
#[cfg(feature = "codec-bincode")]
mod bincode;
#[cfg(feature = "default-codec-bincode")]
#[doc(no_inline)]
pub use self::bincode::Bincode as Default;
#[cfg(feature = "default-codec-bincode2")]
#[doc(no_inline)]
pub use self::bincode::Bincode2 as Default;
#[cfg(feature = "codec-bincode")]
pub use self::bincode::{Bincode, Bincode2};
#[cfg(feature = "codec-ciborium")]
mod ciborium;
#[cfg(feature = "codec-ciborium")]
pub use self::ciborium::Ciborium;
#[cfg(feature = "default-codec-ciborium")]
#[doc(no_inline)]
pub use self::ciborium::Ciborium as Default;
#[cfg(feature = "codec-json")]
mod json;
#[cfg(feature = "codec-json")]
pub use json::Json;
#[cfg(feature = "default-codec-json")]
#[doc(no_inline)]
pub use json::Json as Default;
#[cfg(feature = "codec-message-pack")]
mod message_pack;
#[cfg(feature = "codec-message-pack")]
pub use message_pack::MessagePack;
#[cfg(feature = "default-codec-message-pack")]
#[doc(no_inline)]
pub use message_pack::MessagePack as Default;
#[cfg(feature = "codec-postcard")]
mod postcard;
#[cfg(feature = "codec-postcard")]
pub use postcard::Postcard;
#[cfg(feature = "default-codec-postcard")]
#[doc(no_inline)]
pub use postcard::Postcard as Default;
#[cfg(not(feature = "default-codec-set"))]
pub struct Default;