Skip to content

Commit f69e1ff

Browse files
committed
Fix serialization of i128 and u128 types
Signed-off-by: koushiro <[email protected]>
1 parent 32f1568 commit f69e1ff

File tree

2 files changed

+36
-0
lines changed

2 files changed

+36
-0
lines changed

src/value/ser.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,13 @@ impl serde::Serializer for Serializer {
7777
Ok(Value::Number(value.into()))
7878
}
7979

80+
serde_if_integer128! {
81+
#[cfg(feature = "arbitrary_precision")]
82+
fn serialize_i128(self, value: i128) -> Result<Value, Error> {
83+
Ok(Value::Number(Number::from_string_unchecked(value.to_string())))
84+
}
85+
}
86+
8087
#[inline]
8188
fn serialize_u8(self, value: u8) -> Result<Value, Error> {
8289
self.serialize_u64(value as u64)
@@ -97,6 +104,13 @@ impl serde::Serializer for Serializer {
97104
Ok(Value::Number(value.into()))
98105
}
99106

107+
serde_if_integer128! {
108+
#[cfg(feature = "arbitrary_precision")]
109+
fn serialize_u128(self, value: u128) -> Result<Value, Error> {
110+
Ok(Value::Number(Number::from_string_unchecked(value.to_string())))
111+
}
112+
}
113+
100114
#[inline]
101115
fn serialize_f32(self, value: f32) -> Result<Value, Error> {
102116
self.serialize_f64(value as f64)

tests/test.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1909,6 +1909,28 @@ fn test_partialeq_number() {
19091909
);
19101910
}
19111911

1912+
#[test]
1913+
#[cfg(integer128)]
1914+
#[cfg(feature = "arbitrary_precision")]
1915+
fn test_partialeq_integer128() {
1916+
use std::{u128, i128};
1917+
use std::str::FromStr;
1918+
fn test_u128_number_partial_eq(input: u128) {
1919+
let val1 = serde_json::Value::from_str(&format!("{}", input)).unwrap();
1920+
let val2 = serde_json::to_value(input).unwrap();
1921+
assert_eq!(val1, val2);
1922+
}
1923+
fn test_i128_number_partial_eq(input: i128) {
1924+
let val1 = serde_json::Value::from_str(&format!("{}", input)).unwrap();
1925+
let val2 = serde_json::to_value(input).unwrap();
1926+
assert_eq!(val1, val2);
1927+
}
1928+
test_u128_number_partial_eq(u128::MAX);
1929+
test_u128_number_partial_eq(u128::MIN);
1930+
test_i128_number_partial_eq(i128::MAX);
1931+
test_i128_number_partial_eq(i128::MIN);
1932+
}
1933+
19121934
#[test]
19131935
fn test_partialeq_string() {
19141936
let v = to_value("42").unwrap();

0 commit comments

Comments
 (0)