From f69e1ffe3fb07e2e221ea45ec4f4935a86ca1953 Mon Sep 17 00:00:00 2001 From: koushiro Date: Sat, 29 Dec 2018 17:08:02 +0800 Subject: [PATCH] Fix serialization of i128 and u128 types Signed-off-by: koushiro --- src/value/ser.rs | 14 ++++++++++++++ tests/test.rs | 22 ++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/src/value/ser.rs b/src/value/ser.rs index 172784c..c377b53 100644 --- a/src/value/ser.rs +++ b/src/value/ser.rs @@ -77,6 +77,13 @@ impl serde::Serializer for Serializer { Ok(Value::Number(value.into())) } + serde_if_integer128! { + #[cfg(feature = "arbitrary_precision")] + fn serialize_i128(self, value: i128) -> Result { + Ok(Value::Number(Number::from_string_unchecked(value.to_string()))) + } + } + #[inline] fn serialize_u8(self, value: u8) -> Result { self.serialize_u64(value as u64) @@ -97,6 +104,13 @@ impl serde::Serializer for Serializer { Ok(Value::Number(value.into())) } + serde_if_integer128! { + #[cfg(feature = "arbitrary_precision")] + fn serialize_u128(self, value: u128) -> Result { + Ok(Value::Number(Number::from_string_unchecked(value.to_string()))) + } + } + #[inline] fn serialize_f32(self, value: f32) -> Result { self.serialize_f64(value as f64) diff --git a/tests/test.rs b/tests/test.rs index 97da813..21e5796 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -1909,6 +1909,28 @@ fn test_partialeq_number() { ); } +#[test] +#[cfg(integer128)] +#[cfg(feature = "arbitrary_precision")] +fn test_partialeq_integer128() { + use std::{u128, i128}; + use std::str::FromStr; + fn test_u128_number_partial_eq(input: u128) { + let val1 = serde_json::Value::from_str(&format!("{}", input)).unwrap(); + let val2 = serde_json::to_value(input).unwrap(); + assert_eq!(val1, val2); + } + fn test_i128_number_partial_eq(input: i128) { + let val1 = serde_json::Value::from_str(&format!("{}", input)).unwrap(); + let val2 = serde_json::to_value(input).unwrap(); + assert_eq!(val1, val2); + } + test_u128_number_partial_eq(u128::MAX); + test_u128_number_partial_eq(u128::MIN); + test_i128_number_partial_eq(i128::MAX); + test_i128_number_partial_eq(i128::MIN); +} + #[test] fn test_partialeq_string() { let v = to_value("42").unwrap();