Skip to content

Commit 26fec05

Browse files
committed
Add Serde impls for i128 and u128
1 parent fdb51cc commit 26fec05

File tree

3 files changed

+179
-0
lines changed

3 files changed

+179
-0
lines changed

serde/src/de/from_primitive.rs

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,3 +178,91 @@ impl_from_primitive_for_uint!(u32);
178178
impl_from_primitive_for_uint!(u64);
179179
impl_from_primitive_for_float!(f32);
180180
impl_from_primitive_for_float!(f64);
181+
182+
serde_if_integer128! {
183+
impl FromPrimitive for i128 {
184+
#[inline]
185+
fn from_i8(n: i8) -> Option<Self> {
186+
Some(n as i128)
187+
}
188+
#[inline]
189+
fn from_i16(n: i16) -> Option<Self> {
190+
Some(n as i128)
191+
}
192+
#[inline]
193+
fn from_i32(n: i32) -> Option<Self> {
194+
Some(n as i128)
195+
}
196+
#[inline]
197+
fn from_i64(n: i64) -> Option<Self> {
198+
Some(n as i128)
199+
}
200+
#[inline]
201+
fn from_u8(n: u8) -> Option<Self> {
202+
Some(n as i128)
203+
}
204+
#[inline]
205+
fn from_u16(n: u16) -> Option<Self> {
206+
Some(n as i128)
207+
}
208+
#[inline]
209+
fn from_u32(n: u32) -> Option<Self> {
210+
Some(n as i128)
211+
}
212+
#[inline]
213+
fn from_u64(n: u64) -> Option<Self> {
214+
Some(n as i128)
215+
}
216+
}
217+
218+
impl FromPrimitive for u128 {
219+
#[inline]
220+
fn from_i8(n: i8) -> Option<Self> {
221+
if n >= 0 {
222+
Some(n as u128)
223+
} else {
224+
None
225+
}
226+
}
227+
#[inline]
228+
fn from_i16(n: i16) -> Option<Self> {
229+
if n >= 0 {
230+
Some(n as u128)
231+
} else {
232+
None
233+
}
234+
}
235+
#[inline]
236+
fn from_i32(n: i32) -> Option<Self> {
237+
if n >= 0 {
238+
Some(n as u128)
239+
} else {
240+
None
241+
}
242+
}
243+
#[inline]
244+
fn from_i64(n: i64) -> Option<Self> {
245+
if n >= 0 {
246+
Some(n as u128)
247+
} else {
248+
None
249+
}
250+
}
251+
#[inline]
252+
fn from_u8(n: u8) -> Option<Self> {
253+
Some(n as u128)
254+
}
255+
#[inline]
256+
fn from_u16(n: u16) -> Option<Self> {
257+
Some(n as u128)
258+
}
259+
#[inline]
260+
fn from_u32(n: u32) -> Option<Self> {
261+
Some(n as u128)
262+
}
263+
#[inline]
264+
fn from_u64(n: u64) -> Option<Self> {
265+
Some(n as u128)
266+
}
267+
}
268+
}

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)