diff --git a/src/serde_impl.rs b/src/serde_impl.rs index 0bf79fb..073e062 100644 --- a/src/serde_impl.rs +++ b/src/serde_impl.rs @@ -85,3 +85,37 @@ where Ok(interner) } } + +macro_rules! impl_serde_for_symbol { + ($name:ident, $ty:ty) => { + impl ::serde::Serialize for $crate::symbol::$name { + fn serialize( + &self, + serializer: T, + ) -> ::core::result::Result { + self.value.serialize(serializer) + } + } + + impl<'de> ::serde::Deserialize<'de> for $crate::symbol::$name { + fn deserialize>( + deserializer: D, + ) -> ::core::result::Result { + let index = <$ty as ::serde::Deserialize<'de>>::deserialize(deserializer)?; + let ::core::option::Option::Some(symbol) = Self::new(index) else { + return ::core::result::Result::Err(::custom( + ::core::concat!( + "invalid index value for `", + ::core::stringify!($name), + "`" + ), + )); + }; + ::core::result::Result::Ok(symbol) + } + } + }; +} +impl_serde_for_symbol!(SymbolU16, u16); +impl_serde_for_symbol!(SymbolU32, u32); +impl_serde_for_symbol!(SymbolUsize, usize); diff --git a/src/symbol.rs b/src/symbol.rs index a9c0fb0..f6b05c9 100644 --- a/src/symbol.rs +++ b/src/symbol.rs @@ -63,14 +63,20 @@ macro_rules! gen_symbol_for { $( #[$doc] )* #[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] pub struct $name { - value: $non_zero, + pub(crate) value: $non_zero, + } + + impl $name { + pub(crate) fn new(index: $base_ty) -> Option { + <$non_zero>::new((index).wrapping_add(1)) + .map(|value| Self { value }) + } } impl Symbol for $name { #[inline] fn try_from_usize(index: usize) -> Option { - <$non_zero>::new((index as $base_ty).wrapping_add(1)) - .map(|value| Self { value }) + Self::new(index as $base_ty) } #[inline]