Skip to content

Commit 929ac60

Browse files
committed
Add Serde impls for i128 and u128
1 parent 06eff55 commit 929ac60

File tree

3 files changed

+93
-0
lines changed

3 files changed

+93
-0
lines changed

serde/src/de/from_primitive.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,10 +197,12 @@ impl_from_primitive_for_int!(i8);
197197
impl_from_primitive_for_int!(i16);
198198
impl_from_primitive_for_int!(i32);
199199
impl_from_primitive_for_int!(i64);
200+
impl_from_primitive_for_int!(i128);
200201
impl_from_primitive_for_uint!(usize);
201202
impl_from_primitive_for_uint!(u8);
202203
impl_from_primitive_for_uint!(u16);
203204
impl_from_primitive_for_uint!(u32);
204205
impl_from_primitive_for_uint!(u64);
206+
impl_from_primitive_for_uint!(u128);
205207
impl_from_primitive_for_float!(f32);
206208
impl_from_primitive_for_float!(f64);

serde/src/de/impls.rs

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,92 @@ impl_deserialize_num!(usize, deserialize_u64, integer);
166166
impl_deserialize_num!(f32, deserialize_f32, integer, float);
167167
impl_deserialize_num!(f64, deserialize_f64, integer, float);
168168

169+
serde_if_integer128! {
170+
impl<'de> Deserialize<'de> for i128 {
171+
#[inline]
172+
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
173+
where
174+
D: Deserializer<'de>,
175+
{
176+
struct PrimitiveVisitor;
177+
178+
impl<'de> Visitor<'de> for PrimitiveVisitor {
179+
type Value = i128;
180+
181+
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
182+
formatter.write_str("i128")
183+
}
184+
185+
impl_deserialize_num!(integer i128);
186+
187+
#[inline]
188+
fn visit_i128<E>(self, v: i128) -> Result<Self::Value, E>
189+
where
190+
E: Error,
191+
{
192+
Ok(v)
193+
}
194+
195+
#[inline]
196+
fn visit_u128<E>(self, v: u128) -> Result<Self::Value, E>
197+
where
198+
E: Error,
199+
{
200+
if v <= i128::max_value() as u128 {
201+
Ok(v as i128)
202+
} else {
203+
Err(Error::invalid_value(Unexpected::Other("u128"), &self))
204+
}
205+
}
206+
}
207+
208+
deserializer.deserialize_i128(PrimitiveVisitor)
209+
}
210+
}
211+
212+
impl<'de> Deserialize<'de> for u128 {
213+
#[inline]
214+
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
215+
where
216+
D: Deserializer<'de>,
217+
{
218+
struct PrimitiveVisitor;
219+
220+
impl<'de> Visitor<'de> for PrimitiveVisitor {
221+
type Value = u128;
222+
223+
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
224+
formatter.write_str("u128")
225+
}
226+
227+
impl_deserialize_num!(integer u128);
228+
229+
#[inline]
230+
fn visit_i128<E>(self, v: i128) -> Result<Self::Value, E>
231+
where
232+
E: Error,
233+
{
234+
if v >= 0 {
235+
Ok(v as u128)
236+
} else {
237+
Err(Error::invalid_value(Unexpected::Other("i128"), &self))
238+
}
239+
}
240+
241+
#[inline]
242+
fn visit_u128<E>(self, v: u128) -> Result<Self::Value, E>
243+
where
244+
E: Error,
245+
{
246+
Ok(v)
247+
}
248+
}
249+
250+
deserializer.deserialize_u128(PrimitiveVisitor)
251+
}
252+
}
253+
}
254+
169255
////////////////////////////////////////////////////////////////////////////////
170256

171257
struct CharVisitor;

serde/src/ser/impls.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,11 @@ primitive_impl!(f32, serialize_f32);
4444
primitive_impl!(f64, serialize_f64);
4545
primitive_impl!(char, serialize_char);
4646

47+
serde_if_integer128! {
48+
primitive_impl!(i128, serialize_i128);
49+
primitive_impl!(u128, serialize_u128);
50+
}
51+
4752
////////////////////////////////////////////////////////////////////////////////
4853

4954
impl Serialize for str {

0 commit comments

Comments
 (0)