Fix serialization of i128 and u128 types

Signed-off-by: koushiro <koushiro.cqx@gmail.com>
This commit is contained in:
koushiro 2018-12-29 17:08:02 +08:00
parent 32f1568c2a
commit f69e1ffe3f
2 changed files with 36 additions and 0 deletions

View File

@ -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<Value, Error> {
Ok(Value::Number(Number::from_string_unchecked(value.to_string())))
}
}
#[inline]
fn serialize_u8(self, value: u8) -> Result<Value, Error> {
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<Value, Error> {
Ok(Value::Number(Number::from_string_unchecked(value.to_string())))
}
}
#[inline]
fn serialize_f32(self, value: f32) -> Result<Value, Error> {
self.serialize_f64(value as f64)

View File

@ -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();