Skip to content

Commit d63eed4

Browse files
authored
Impl serde::{Serialize, Deserialize} for crate defined symbol types (#86)
* add pub(crate) new constructor for symbols * add Serialize and Deserialize impls for symbols
1 parent a0bcae3 commit d63eed4

2 files changed

Lines changed: 43 additions & 3 deletions

File tree

src/serde_impl.rs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,3 +85,37 @@ where
8585
Ok(interner)
8686
}
8787
}
88+
89+
macro_rules! impl_serde_for_symbol {
90+
($name:ident, $ty:ty) => {
91+
impl ::serde::Serialize for $crate::symbol::$name {
92+
fn serialize<T: ::serde::Serializer>(
93+
&self,
94+
serializer: T,
95+
) -> ::core::result::Result<T::Ok, T::Error> {
96+
self.value.serialize(serializer)
97+
}
98+
}
99+
100+
impl<'de> ::serde::Deserialize<'de> for $crate::symbol::$name {
101+
fn deserialize<D: ::serde::Deserializer<'de>>(
102+
deserializer: D,
103+
) -> ::core::result::Result<Self, D::Error> {
104+
let index = <$ty as ::serde::Deserialize<'de>>::deserialize(deserializer)?;
105+
let ::core::option::Option::Some(symbol) = Self::new(index) else {
106+
return ::core::result::Result::Err(<D::Error as ::serde::de::Error>::custom(
107+
::core::concat!(
108+
"invalid index value for `",
109+
::core::stringify!($name),
110+
"`"
111+
),
112+
));
113+
};
114+
::core::result::Result::Ok(symbol)
115+
}
116+
}
117+
};
118+
}
119+
impl_serde_for_symbol!(SymbolU16, u16);
120+
impl_serde_for_symbol!(SymbolU32, u32);
121+
impl_serde_for_symbol!(SymbolUsize, usize);

src/symbol.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,14 +63,20 @@ macro_rules! gen_symbol_for {
6363
$( #[$doc] )*
6464
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
6565
pub struct $name {
66-
value: $non_zero,
66+
pub(crate) value: $non_zero,
67+
}
68+
69+
impl $name {
70+
pub(crate) fn new(index: $base_ty) -> Option<Self> {
71+
<$non_zero>::new((index).wrapping_add(1))
72+
.map(|value| Self { value })
73+
}
6774
}
6875

6976
impl Symbol for $name {
7077
#[inline]
7178
fn try_from_usize(index: usize) -> Option<Self> {
72-
<$non_zero>::new((index as $base_ty).wrapping_add(1))
73-
.map(|value| Self { value })
79+
Self::new(index as $base_ty)
7480
}
7581

7682
#[inline]

0 commit comments

Comments
 (0)