Skip to content

Commit 72d99b2

Browse files
authored
feat(core): Add (De)serialize impls for non-zero primitives. (#111)
1 parent aa6af63 commit 72d99b2

File tree

1 file changed

+77
-0
lines changed

1 file changed

+77
-0
lines changed

xmlity/src/types/primitive.rs

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,3 +87,80 @@ impl<'de> Deserialize<'de> for bool {
8787
reader.deserialize_any(BoolVisitor)
8888
}
8989
}
90+
91+
macro_rules! impl_serialize_for_nonzero_primitive {
92+
($($t:ty),*) => {
93+
$(
94+
impl Serialize for $t {
95+
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
96+
serializer.serialize_text(self.get().to_string())
97+
}
98+
}
99+
)*
100+
};
101+
}
102+
103+
impl_serialize_for_nonzero_primitive!(
104+
core::num::NonZeroU8,
105+
core::num::NonZeroU16,
106+
core::num::NonZeroU32,
107+
core::num::NonZeroU64,
108+
core::num::NonZeroU128,
109+
core::num::NonZeroI8,
110+
core::num::NonZeroI16,
111+
core::num::NonZeroI32,
112+
core::num::NonZeroI64,
113+
core::num::NonZeroI128
114+
);
115+
116+
macro_rules! impl_deserialize_for_nonzero_primitive {
117+
($($t:ty),*) => {
118+
$(
119+
impl<'de> Deserialize<'de> for $t {
120+
fn deserialize<D: Deserializer<'de>>(reader: D) -> Result<Self, D::Error> {
121+
let value = Deserialize::<'de>::deserialize(reader)?;
122+
<$t>::new(value).ok_or_else(|| de::Error::custom("value cannot be zero"))
123+
}
124+
}
125+
)*
126+
};
127+
}
128+
129+
impl_deserialize_for_nonzero_primitive!(
130+
core::num::NonZeroU8,
131+
core::num::NonZeroU16,
132+
core::num::NonZeroU32,
133+
core::num::NonZeroU64,
134+
core::num::NonZeroU128,
135+
core::num::NonZeroI8,
136+
core::num::NonZeroI16,
137+
core::num::NonZeroI32,
138+
core::num::NonZeroI64,
139+
core::num::NonZeroI128
140+
);
141+
142+
#[cfg(test)]
143+
mod tests {
144+
use crate::value::XmlText;
145+
146+
use super::*;
147+
148+
#[test]
149+
fn test_de_serialize_non_zero_i8() {
150+
let value = XmlText::new("42");
151+
152+
let result = <core::num::NonZeroI8>::deserialize(&value);
153+
154+
let result = result.expect("deserialize should not fail");
155+
assert_eq!(result.get(), 42);
156+
}
157+
158+
#[test]
159+
fn test_de_serialize_non_zero_i8_zero_value() {
160+
let value = XmlText::new("0");
161+
162+
let result = <core::num::NonZeroI8>::deserialize(&value);
163+
164+
let _err = result.expect_err("deserialize should fail");
165+
}
166+
}

0 commit comments

Comments
 (0)