#[cfg(feature = "serde")]
const _: () = {
extern crate alloc;
use alloc::{string::ToString, borrow::Cow, format};
use core::{any::type_name, str::FromStr, fmt::Display};
use crate::{ReprEnum, ESet};
impl<T: ReprEnum, const SEP: char> serde::Serialize for ESet<T, SEP>
where T::FlagsRepr: serde::Serialize, Self: Display{
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: serde::Serializer {
if serializer.is_human_readable(){
self.to_string().serialize(serializer)
} else {
self.0.serialize(serializer)
}
}
}
impl<'de, T: ReprEnum, const SEP: char> serde::Deserialize<'de> for ESet<T, SEP>
where T::FlagsRepr: serde::Deserialize<'de>, Self: FromStr{
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: serde::Deserializer<'de> {
if deserializer.is_human_readable() {
let str = <Cow<str>>::deserialize(deserializer)?;
Self::from_str(str.as_ref()).map_err(|_| serde::de::Error::custom(
format!("\"{}\" is not a valid ESet<{}> with '{}' separator.", str, type_name::<T>(), SEP)
))
} else {
Ok(Self(T::FlagsRepr::deserialize(deserializer)?))
}
}
}
};
#[cfg(feature = "rkyv")]
const _: () = {
use rkyv::{Archive, Serialize, Deserialize, Fallible};
use crate::{ESet, ReprEnum};
impl<T: ReprEnum, const S: char> Archive for ESet<T, S> where Self: Copy {
type Archived = Self;
type Resolver = ();
unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived) {
out.write(*self)
}
}
impl<S: Fallible, T: ReprEnum, const SEP: char> Serialize<S> for ESet<T, SEP> where Self: Copy {
fn serialize(&self, _: &mut S) -> Result<Self::Resolver, S::Error> {
Ok(())
}
}
impl<D: Fallible, T: ReprEnum, const SEP: char> Deserialize<Self, D> for ESet<T, SEP> where Self: Copy {
fn deserialize(&self, _: &mut D) -> Result<Self, D::Error> {
Ok(*self)
}
}
};