Skip to content

Commit e3d13cd

Browse files
committed
Support 128-bit integers in to_value
1 parent f77ad47 commit e3d13cd

File tree

1 file changed

+30
-4
lines changed

1 file changed

+30
-4
lines changed

src/value/ser.rs

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ use crate::value::{to_value, Value};
55
use alloc::borrow::ToOwned;
66
use alloc::string::{String, ToString};
77
use alloc::vec::Vec;
8+
#[cfg(not(feature = "arbitrary_precision"))]
9+
use core::convert::TryFrom;
810
use core::fmt::Display;
911
use core::result;
1012
use serde::ser::{Impossible, Serialize};
@@ -92,9 +94,22 @@ impl serde::Serializer for Serializer {
9294
Ok(Value::Number(value.into()))
9395
}
9496

95-
#[cfg(feature = "arbitrary_precision")]
9697
fn serialize_i128(self, value: i128) -> Result<Value> {
97-
Ok(Value::Number(value.into()))
98+
#[cfg(feature = "arbitrary_precision")]
99+
{
100+
Ok(Value::Number(value.into()))
101+
}
102+
103+
#[cfg(not(feature = "arbitrary_precision"))]
104+
{
105+
if let Ok(value) = u64::try_from(value) {
106+
Ok(Value::Number(value.into()))
107+
} else if let Ok(value) = i64::try_from(value) {
108+
Ok(Value::Number(value.into()))
109+
} else {
110+
Err(Error::syntax(ErrorCode::NumberOutOfRange, 0, 0))
111+
}
112+
}
98113
}
99114

100115
#[inline]
@@ -117,9 +132,20 @@ impl serde::Serializer for Serializer {
117132
Ok(Value::Number(value.into()))
118133
}
119134

120-
#[cfg(feature = "arbitrary_precision")]
121135
fn serialize_u128(self, value: u128) -> Result<Value> {
122-
Ok(Value::Number(value.into()))
136+
#[cfg(feature = "arbitrary_precision")]
137+
{
138+
Ok(Value::Number(value.into()))
139+
}
140+
141+
#[cfg(not(feature = "arbitrary_precision"))]
142+
{
143+
if let Ok(value) = u64::try_from(value) {
144+
Ok(Value::Number(value.into()))
145+
} else {
146+
Err(Error::syntax(ErrorCode::NumberOutOfRange, 0, 0))
147+
}
148+
}
123149
}
124150

125151
#[inline]

0 commit comments

Comments
 (0)