@@ -5,6 +5,8 @@ use crate::value::{to_value, Value};
5
5
use alloc:: borrow:: ToOwned ;
6
6
use alloc:: string:: { String , ToString } ;
7
7
use alloc:: vec:: Vec ;
8
+ #[ cfg( not( feature = "arbitrary_precision" ) ) ]
9
+ use core:: convert:: TryFrom ;
8
10
use core:: fmt:: Display ;
9
11
use core:: result;
10
12
use serde:: ser:: { Impossible , Serialize } ;
@@ -92,9 +94,22 @@ impl serde::Serializer for Serializer {
92
94
Ok ( Value :: Number ( value. into ( ) ) )
93
95
}
94
96
95
- #[ cfg( feature = "arbitrary_precision" ) ]
96
97
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
+ }
98
113
}
99
114
100
115
#[ inline]
@@ -117,9 +132,20 @@ impl serde::Serializer for Serializer {
117
132
Ok ( Value :: Number ( value. into ( ) ) )
118
133
}
119
134
120
- #[ cfg( feature = "arbitrary_precision" ) ]
121
135
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
+ }
123
149
}
124
150
125
151
#[ inline]
0 commit comments