aboutsummaryrefslogtreecommitdiff
path: root/src/value/ser.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/value/ser.rs')
-rw-r--r--src/value/ser.rs34
1 files changed, 30 insertions, 4 deletions
diff --git a/src/value/ser.rs b/src/value/ser.rs
index 892a63d..a29814e 100644
--- a/src/value/ser.rs
+++ b/src/value/ser.rs
@@ -5,6 +5,8 @@ use crate::value::{to_value, Value};
use alloc::borrow::ToOwned;
use alloc::string::{String, ToString};
use alloc::vec::Vec;
+#[cfg(not(feature = "arbitrary_precision"))]
+use core::convert::TryFrom;
use core::fmt::Display;
use core::result;
use serde::ser::{Impossible, Serialize};
@@ -92,9 +94,22 @@ impl serde::Serializer for Serializer {
Ok(Value::Number(value.into()))
}
- #[cfg(feature = "arbitrary_precision")]
fn serialize_i128(self, value: i128) -> Result<Value> {
- Ok(Value::Number(value.into()))
+ #[cfg(feature = "arbitrary_precision")]
+ {
+ Ok(Value::Number(value.into()))
+ }
+
+ #[cfg(not(feature = "arbitrary_precision"))]
+ {
+ if let Ok(value) = u64::try_from(value) {
+ Ok(Value::Number(value.into()))
+ } else if let Ok(value) = i64::try_from(value) {
+ Ok(Value::Number(value.into()))
+ } else {
+ Err(Error::syntax(ErrorCode::NumberOutOfRange, 0, 0))
+ }
+ }
}
#[inline]
@@ -117,9 +132,20 @@ impl serde::Serializer for Serializer {
Ok(Value::Number(value.into()))
}
- #[cfg(feature = "arbitrary_precision")]
fn serialize_u128(self, value: u128) -> Result<Value> {
- Ok(Value::Number(value.into()))
+ #[cfg(feature = "arbitrary_precision")]
+ {
+ Ok(Value::Number(value.into()))
+ }
+
+ #[cfg(not(feature = "arbitrary_precision"))]
+ {
+ if let Ok(value) = u64::try_from(value) {
+ Ok(Value::Number(value.into()))
+ } else {
+ Err(Error::syntax(ErrorCode::NumberOutOfRange, 0, 0))
+ }
+ }
}
#[inline]