eset 0.1.0

A simple library for flags like enums.
Documentation

#[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 {
            // we don't use serde's variant because it only supports u32
            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)
        }
    }
};