amadeus-core 0.3.7

Harmonious distributed data analysis in Rust.
Documentation
use serde::{Deserialize, Deserializer, Serialize, Serializer};
use std::{io, sync::Arc};

pub struct Serde<T>(T);

impl Serialize for Serde<&io::ErrorKind> {
	fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
	where
		S: Serializer,
	{
		usize::serialize(
			&match self.0 {
				io::ErrorKind::NotFound => 0,
				io::ErrorKind::PermissionDenied => 1,
				io::ErrorKind::ConnectionRefused => 2,
				io::ErrorKind::ConnectionReset => 3,
				io::ErrorKind::ConnectionAborted => 4,
				io::ErrorKind::NotConnected => 5,
				io::ErrorKind::AddrInUse => 6,
				io::ErrorKind::AddrNotAvailable => 7,
				io::ErrorKind::BrokenPipe => 8,
				io::ErrorKind::AlreadyExists => 9,
				io::ErrorKind::WouldBlock => 10,
				io::ErrorKind::InvalidInput => 11,
				io::ErrorKind::InvalidData => 12,
				io::ErrorKind::TimedOut => 13,
				io::ErrorKind::WriteZero => 14,
				io::ErrorKind::Interrupted => 15,
				io::ErrorKind::UnexpectedEof => 17,
				_ => 16,
			},
			serializer,
		)
	}
}
impl<'de> Deserialize<'de> for Serde<io::ErrorKind> {
	fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
	where
		D: Deserializer<'de>,
	{
		usize::deserialize(deserializer)
			.map(|kind| match kind {
				0 => io::ErrorKind::NotFound,
				1 => io::ErrorKind::PermissionDenied,
				2 => io::ErrorKind::ConnectionRefused,
				3 => io::ErrorKind::ConnectionReset,
				4 => io::ErrorKind::ConnectionAborted,
				5 => io::ErrorKind::NotConnected,
				6 => io::ErrorKind::AddrInUse,
				7 => io::ErrorKind::AddrNotAvailable,
				8 => io::ErrorKind::BrokenPipe,
				9 => io::ErrorKind::AlreadyExists,
				10 => io::ErrorKind::WouldBlock,
				11 => io::ErrorKind::InvalidInput,
				12 => io::ErrorKind::InvalidData,
				13 => io::ErrorKind::TimedOut,
				14 => io::ErrorKind::WriteZero,
				15 => io::ErrorKind::Interrupted,
				17 => io::ErrorKind::UnexpectedEof,
				_ => io::ErrorKind::Other,
			})
			.map(Self)
	}
}

impl Serialize for Serde<&Arc<io::Error>> {
	fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
	where
		S: Serializer,
	{
		<(Serde<&io::ErrorKind>, String)>::serialize(
			&(Serde(&self.0.kind()), self.0.to_string()),
			serializer,
		)
	}
}
impl<'de> Deserialize<'de> for Serde<Arc<io::Error>> {
	fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
	where
		D: Deserializer<'de>,
	{
		<(Serde<io::ErrorKind>, String)>::deserialize(deserializer)
			.map(|(kind, message)| Arc::new(io::Error::new(kind.0, message)))
			.map(Self)
	}
}

impl Serialize for Serde<&io::Error> {
	fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
	where
		S: Serializer,
	{
		<(Serde<&io::ErrorKind>, String)>::serialize(
			&(Serde(&self.0.kind()), self.0.to_string()),
			serializer,
		)
	}
}
impl<'de> Deserialize<'de> for Serde<io::Error> {
	fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
	where
		D: Deserializer<'de>,
	{
		<(Serde<io::ErrorKind>, String)>::deserialize(deserializer)
			.map(|(kind, message)| io::Error::new(kind.0, message))
			.map(Self)
	}
}

pub fn serialize<T, S>(t: &T, serializer: S) -> Result<S::Ok, S::Error>
where
	for<'a> Serde<&'a T>: Serialize,
	S: Serializer,
{
	Serde(t).serialize(serializer)
}
pub fn deserialize<'de, T, D>(deserializer: D) -> Result<T, D::Error>
where
	Serde<T>: Deserialize<'de>,
	D: Deserializer<'de>,
{
	Serde::<T>::deserialize(deserializer).map(|x| x.0)
}