Skip to content

Commit 8e0d092

Browse files
committed
fix: Serialize full i128/u128 range
2 parents 6981823 + c62d8fa commit 8e0d092

4 files changed

Lines changed: 18 additions & 42 deletions

File tree

src/ser.rs

Lines changed: 3 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -109,21 +109,7 @@ impl<'a> ser::Serializer for &'a mut ConfigSerializer {
109109
}
110110

111111
fn serialize_i128(self, v: i128) -> Result<Self::Ok> {
112-
if v > i64::MAX.into() {
113-
Err(ConfigError::Message(format!(
114-
"value {} is greater than the max {}",
115-
v,
116-
i64::MAX
117-
)))
118-
} else if v < i64::MIN.into() {
119-
Err(ConfigError::Message(format!(
120-
"value {} is less than the min {}",
121-
v,
122-
i64::MIN
123-
)))
124-
} else {
125-
self.serialize_i64(v as i64)
126-
}
112+
self.serialize_primitive(v)
127113
}
128114

129115
fn serialize_u8(self, v: u8) -> Result<Self::Ok> {
@@ -139,27 +125,11 @@ impl<'a> ser::Serializer for &'a mut ConfigSerializer {
139125
}
140126

141127
fn serialize_u64(self, v: u64) -> Result<Self::Ok> {
142-
if v > (i64::MAX as u64) {
143-
Err(ConfigError::Message(format!(
144-
"value {} is greater than the max {}",
145-
v,
146-
i64::MAX
147-
)))
148-
} else {
149-
self.serialize_i64(v as i64)
150-
}
128+
self.serialize_primitive(v)
151129
}
152130

153131
fn serialize_u128(self, v: u128) -> Result<Self::Ok> {
154-
if v > (i64::MAX as u128) {
155-
Err(ConfigError::Message(format!(
156-
"value {} is greater than the max {}",
157-
v,
158-
i64::MAX
159-
)))
160-
} else {
161-
self.serialize_i64(v as i64)
162-
}
132+
self.serialize_primitive(v)
163133
}
164134

165135
fn serialize_f32(self, v: f32) -> Result<Self::Ok> {

src/value.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -276,21 +276,21 @@ impl Value {
276276
ConfigError::invalid_type(
277277
self.origin,
278278
Unexpected::I128(value),
279-
"an signed 64 bit or less integer",
279+
"a signed 64 bit or less integer",
280280
)
281281
}),
282282
ValueKind::U64(value) => value.try_into().map_err(|_| {
283283
ConfigError::invalid_type(
284284
self.origin,
285285
Unexpected::U64(value),
286-
"an signed 64 bit or less integer",
286+
"a signed 64 bit or less integer",
287287
)
288288
}),
289289
ValueKind::U128(value) => value.try_into().map_err(|_| {
290290
ConfigError::invalid_type(
291291
self.origin,
292292
Unexpected::U128(value),
293-
"an signed 64 bit or less integer",
293+
"a signed 64 bit or less integer",
294294
)
295295
}),
296296

tests/testsuite/i128.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
#![cfg(feature = "preserve_order")]
22

3-
use serde::Deserialize;
3+
use serde::{Deserialize, Serialize};
44

5-
#[derive(Debug, Deserialize, Eq, PartialEq)]
5+
#[derive(Debug, Deserialize, Eq, PartialEq, Serialize)]
66
struct Container<T> {
77
inner: T,
88
}
99

10-
#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq)]
10+
#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
1111
struct I128 {
1212
val: i128,
1313
}
@@ -33,4 +33,7 @@ fn test_deserialize_i128_min() {
3333

3434
let deserialized = built.clone().try_deserialize::<Container<I128>>().unwrap();
3535
assert_eq!(deserialized, container);
36+
37+
let serialized = config::Config::try_from(&container).unwrap();
38+
assert_eq!(serialized.cache, built.cache);
3639
}

tests/testsuite/u128.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
#![cfg(feature = "preserve_order")]
22

3-
use serde::Deserialize;
3+
use serde::{Deserialize, Serialize};
44

5-
#[derive(Debug, Deserialize, Eq, PartialEq)]
5+
#[derive(Debug, Deserialize, Eq, PartialEq, Serialize)]
66
struct Container<T> {
77
inner: T,
88
}
99

10-
#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq)]
10+
#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
1111
struct U128 {
1212
val: u128,
1313
}
@@ -33,4 +33,7 @@ fn test_deserialize_u128_min() {
3333

3434
let deserialized = built.clone().try_deserialize::<Container<U128>>().unwrap();
3535
assert_eq!(deserialized, container);
36+
37+
let serialized = config::Config::try_from(&container).unwrap();
38+
assert_eq!(serialized.cache, built.cache);
3639
}

0 commit comments

Comments
 (0)