2 use serde
::de
::{self, Unexpected, Visitor}
;
3 use serde
::{Deserialize, Deserializer, Serialize, Serializer}
;
4 use std
::fmt
::{self, Debug, Display}
;
6 #[cfg(feature = "arbitrary_precision")]
8 #[cfg(feature = "arbitrary_precision")]
10 #[cfg(feature = "arbitrary_precision")]
11 use serde
::de
::{IntoDeserializer, MapAccess}
;
15 #[cfg(feature = "arbitrary_precision")]
18 #[cfg(feature = "arbitrary_precision")]
19 /// Not public API. Should be pub(crate).
21 pub const TOKEN
: &'
static str = "$serde_json::private::Number";
23 /// Represents a JSON number, whether integer or floating point.
24 #[derive(Clone, PartialEq)]
29 #[cfg(not(feature = "arbitrary_precision"))]
30 #[derive(Copy, Clone, PartialEq)]
33 /// Always less than zero.
39 #[cfg(feature = "arbitrary_precision")]
43 /// Returns true if the `Number` is an integer between `i64::MIN` and
46 /// For any Number on which `is_i64` returns true, `as_i64` is guaranteed to
47 /// return the integer value.
50 /// # use serde_json::json;
52 /// let big = i64::max_value() as u64 + 10;
53 /// let v = json!({ "a": 64, "b": big, "c": 256.0 });
55 /// assert!(v["a"].is_i64());
57 /// // Greater than i64::MAX.
58 /// assert!(!v["b"].is_i64());
60 /// // Numbers with a decimal point are not considered integers.
61 /// assert!(!v["c"].is_i64());
64 pub fn is_i64(&self) -> bool
{
65 #[cfg(not(feature = "arbitrary_precision"))]
67 N
::PosInt(v
) => v
<= i64::max_value() as u64,
71 #[cfg(feature = "arbitrary_precision")]
72 self.as_i64().is_some()
75 /// Returns true if the `Number` is an integer between zero and `u64::MAX`.
77 /// For any Number on which `is_u64` returns true, `as_u64` is guaranteed to
78 /// return the integer value.
81 /// # use serde_json::json;
83 /// let v = json!({ "a": 64, "b": -64, "c": 256.0 });
85 /// assert!(v["a"].is_u64());
87 /// // Negative integer.
88 /// assert!(!v["b"].is_u64());
90 /// // Numbers with a decimal point are not considered integers.
91 /// assert!(!v["c"].is_u64());
94 pub fn is_u64(&self) -> bool
{
95 #[cfg(not(feature = "arbitrary_precision"))]
98 N
::NegInt(_
) | N
::Float(_
) => false,
100 #[cfg(feature = "arbitrary_precision")]
101 self.as_u64().is_some()
104 /// Returns true if the `Number` can be represented by f64.
106 /// For any Number on which `is_f64` returns true, `as_f64` is guaranteed to
107 /// return the floating point value.
109 /// Currently this function returns true if and only if both `is_i64` and
110 /// `is_u64` return false but this is not a guarantee in the future.
113 /// # use serde_json::json;
115 /// let v = json!({ "a": 256.0, "b": 64, "c": -64 });
117 /// assert!(v["a"].is_f64());
120 /// assert!(!v["b"].is_f64());
121 /// assert!(!v["c"].is_f64());
124 pub fn is_f64(&self) -> bool
{
125 #[cfg(not(feature = "arbitrary_precision"))]
128 N
::PosInt(_
) | N
::NegInt(_
) => false,
130 #[cfg(feature = "arbitrary_precision")]
132 for c
in self.n
.chars() {
133 if c
== '
.'
|| c
== 'e'
|| c
== 'E'
{
134 return self.n
.parse
::<f64>().ok().map_or(false, |f
| f
.is_finite());
141 /// If the `Number` is an integer, represent it as i64 if possible. Returns
145 /// # use serde_json::json;
147 /// let big = i64::max_value() as u64 + 10;
148 /// let v = json!({ "a": 64, "b": big, "c": 256.0 });
150 /// assert_eq!(v["a"].as_i64(), Some(64));
151 /// assert_eq!(v["b"].as_i64(), None);
152 /// assert_eq!(v["c"].as_i64(), None);
155 pub fn as_i64(&self) -> Option
<i64> {
156 #[cfg(not(feature = "arbitrary_precision"))]
159 if n
<= i64::max_value() as u64 {
165 N
::NegInt(n
) => Some(n
),
168 #[cfg(feature = "arbitrary_precision")]
172 /// If the `Number` is an integer, represent it as u64 if possible. Returns
176 /// # use serde_json::json;
178 /// let v = json!({ "a": 64, "b": -64, "c": 256.0 });
180 /// assert_eq!(v["a"].as_u64(), Some(64));
181 /// assert_eq!(v["b"].as_u64(), None);
182 /// assert_eq!(v["c"].as_u64(), None);
185 pub fn as_u64(&self) -> Option
<u64> {
186 #[cfg(not(feature = "arbitrary_precision"))]
188 N
::PosInt(n
) => Some(n
),
189 N
::NegInt(_
) | N
::Float(_
) => None
,
191 #[cfg(feature = "arbitrary_precision")]
195 /// Represents the number as f64 if possible. Returns None otherwise.
198 /// # use serde_json::json;
200 /// let v = json!({ "a": 256.0, "b": 64, "c": -64 });
202 /// assert_eq!(v["a"].as_f64(), Some(256.0));
203 /// assert_eq!(v["b"].as_f64(), Some(64.0));
204 /// assert_eq!(v["c"].as_f64(), Some(-64.0));
207 pub fn as_f64(&self) -> Option
<f64> {
208 #[cfg(not(feature = "arbitrary_precision"))]
210 N
::PosInt(n
) => Some(n
as f64),
211 N
::NegInt(n
) => Some(n
as f64),
212 N
::Float(n
) => Some(n
),
214 #[cfg(feature = "arbitrary_precision")]
218 /// Converts a finite `f64` to a `Number`. Infinite or NaN values are not JSON
224 /// # use serde_json::Number;
226 /// assert!(Number::from_f64(256.0).is_some());
228 /// assert!(Number::from_f64(f64::NAN).is_none());
231 pub fn from_f64(f
: f64) -> Option
<Number
> {
234 #[cfg(not(feature = "arbitrary_precision"))]
238 #[cfg(feature = "arbitrary_precision")]
240 ryu
::Buffer
::new().format_finite(f
).to_owned()
243 Some(Number { n: n }
)
249 #[cfg(feature = "arbitrary_precision")]
250 /// Not public API. Only tests use this.
253 pub fn from_string_unchecked(n
: String
) -> Self {
258 impl fmt
::Display
for Number
{
259 #[cfg(not(feature = "arbitrary_precision"))]
260 fn fmt(&self, formatter
: &mut fmt
::Formatter
) -> fmt
::Result
{
262 N
::PosInt(u
) => Display
::fmt(&u
, formatter
),
263 N
::NegInt(i
) => Display
::fmt(&i
, formatter
),
264 N
::Float(f
) => Display
::fmt(&f
, formatter
),
268 #[cfg(feature = "arbitrary_precision")]
269 fn fmt(&self, formatter
: &mut fmt
::Formatter
) -> fmt
::Result
{
270 Display
::fmt(&self.n
, formatter
)
274 impl Debug
for Number
{
275 #[cfg(not(feature = "arbitrary_precision"))]
276 fn fmt(&self, formatter
: &mut fmt
::Formatter
) -> fmt
::Result
{
277 let mut debug
= formatter
.debug_tuple("Number");
292 #[cfg(feature = "arbitrary_precision")]
293 fn fmt(&self, formatter
: &mut fmt
::Formatter
) -> fmt
::Result
{
294 write
!(formatter
, "Number({})", &self.n
)
298 impl Serialize
for Number
{
299 #[cfg(not(feature = "arbitrary_precision"))]
301 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
306 N
::PosInt(u
) => serializer
.serialize_u64(u
),
307 N
::NegInt(i
) => serializer
.serialize_i64(i
),
308 N
::Float(f
) => serializer
.serialize_f64(f
),
312 #[cfg(feature = "arbitrary_precision")]
314 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
318 use serde
::ser
::SerializeStruct
;
320 let mut s
= serializer
.serialize_struct(TOKEN
, 1)?
;
321 s
.serialize_field(TOKEN
, &self.n
)?
;
326 impl<'de
> Deserialize
<'de
> for Number
{
328 fn deserialize
<D
>(deserializer
: D
) -> Result
<Number
, D
::Error
>
330 D
: Deserializer
<'de
>,
332 struct NumberVisitor
;
334 impl<'de
> Visitor
<'de
> for NumberVisitor
{
337 fn expecting(&self, formatter
: &mut fmt
::Formatter
) -> fmt
::Result
{
338 formatter
.write_str("a JSON number")
342 fn visit_i64
<E
>(self, value
: i64) -> Result
<Number
, E
> {
347 fn visit_u64
<E
>(self, value
: u64) -> Result
<Number
, E
> {
352 fn visit_f64
<E
>(self, value
: f64) -> Result
<Number
, E
>
356 Number
::from_f64(value
).ok_or_else(|| de
::Error
::custom("not a JSON number"))
359 #[cfg(feature = "arbitrary_precision")]
361 fn visit_map
<V
>(self, mut visitor
: V
) -> Result
<Number
, V
::Error
>
363 V
: de
::MapAccess
<'de
>,
365 let value
= visitor
.next_key
::<NumberKey
>()?
;
367 return Err(de
::Error
::invalid_type(Unexpected
::Map
, &self));
369 let v
: NumberFromString
= visitor
.next_value()?
;
374 deserializer
.deserialize_any(NumberVisitor
)
378 #[cfg(feature = "arbitrary_precision")]
381 #[cfg(feature = "arbitrary_precision")]
382 impl<'de
> de
::Deserialize
<'de
> for NumberKey
{
383 fn deserialize
<D
>(deserializer
: D
) -> Result
<NumberKey
, D
::Error
>
385 D
: de
::Deserializer
<'de
>,
389 impl<'de
> de
::Visitor
<'de
> for FieldVisitor
{
392 fn expecting(&self, formatter
: &mut fmt
::Formatter
) -> fmt
::Result
{
393 formatter
.write_str("a valid number field")
396 fn visit_str
<E
>(self, s
: &str) -> Result
<(), E
>
403 Err(de
::Error
::custom("expected field with custom name"))
408 deserializer
.deserialize_identifier(FieldVisitor
)?
;
413 #[cfg(feature = "arbitrary_precision")]
414 pub struct NumberFromString
{
418 #[cfg(feature = "arbitrary_precision")]
419 impl<'de
> de
::Deserialize
<'de
> for NumberFromString
{
420 fn deserialize
<D
>(deserializer
: D
) -> Result
<NumberFromString
, D
::Error
>
422 D
: de
::Deserializer
<'de
>,
426 impl<'de
> de
::Visitor
<'de
> for Visitor
{
427 type Value
= NumberFromString
;
429 fn expecting(&self, formatter
: &mut fmt
::Formatter
) -> fmt
::Result
{
430 formatter
.write_str("string containing a number")
433 fn visit_str
<E
>(self, s
: &str) -> Result
<NumberFromString
, E
>
437 let n
= try
!(s
.parse().map_err(de
::Error
::custom
));
438 Ok(NumberFromString { value: n }
)
442 deserializer
.deserialize_str(Visitor
)
446 #[cfg(feature = "arbitrary_precision")]
447 fn invalid_number() -> Error
{
448 Error
::syntax(ErrorCode
::InvalidNumber
, 0, 0)
451 macro_rules
! deserialize_any
{
452 (@expand
[$
($num_string
:tt
)*]) => {
453 #[cfg(not(feature = "arbitrary_precision"))]
455 fn deserialize_any
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Error
>
460 N
::PosInt(u
) => visitor
.visit_u64(u
),
461 N
::NegInt(i
) => visitor
.visit_i64(i
),
462 N
::Float(f
) => visitor
.visit_f64(f
),
466 #[cfg(feature = "arbitrary_precision")]
468 fn deserialize_any
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Error
>
469 where V
: Visitor
<'de
>
471 if let Some(u
) = self.as_u64() {
472 return visitor
.visit_u64(u
);
473 } else if let Some(i
) = self.as_i64() {
474 return visitor
.visit_i64(i
);
475 } else if let Some(f
) = self.as_f64() {
476 if ryu
::Buffer
::new().format_finite(f
) == self.n
|| f
.to_string() == self.n
{
477 return visitor
.visit_f64(f
);
481 visitor
.visit_map(NumberDeserializer
{
482 number
: Some(self.$
($num_string
)*),
488 deserialize_any
!(@expand
[n
]);
492 deserialize_any
!(@expand
[n
.clone()]);
496 macro_rules
! deserialize_number
{
497 ($deserialize
:ident
=> $visit
:ident
) => {
498 #[cfg(not(feature = "arbitrary_precision"))]
499 fn $deserialize
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Error
>
503 self.deserialize_any(visitor
)
506 #[cfg(feature = "arbitrary_precision")]
507 fn $deserialize
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Error
>
511 visitor
.$
visit(self.n
.parse().map_err(|_
| invalid_number())?
)
516 impl<'de
> Deserializer
<'de
> for Number
{
519 deserialize_any
!(owned
);
521 deserialize_number
!(deserialize_i8
=> visit_i8
);
522 deserialize_number
!(deserialize_i16
=> visit_i16
);
523 deserialize_number
!(deserialize_i32
=> visit_i32
);
524 deserialize_number
!(deserialize_i64
=> visit_i64
);
525 deserialize_number
!(deserialize_u8
=> visit_u8
);
526 deserialize_number
!(deserialize_u16
=> visit_u16
);
527 deserialize_number
!(deserialize_u32
=> visit_u32
);
528 deserialize_number
!(deserialize_u64
=> visit_u64
);
529 deserialize_number
!(deserialize_f32
=> visit_f32
);
530 deserialize_number
!(deserialize_f64
=> visit_f64
);
532 serde_if_integer128
! {
533 deserialize_number
!(deserialize_i128
=> visit_i128
);
534 deserialize_number
!(deserialize_u128
=> visit_u128
);
537 forward_to_deserialize_any
! {
538 bool
char str string bytes byte_buf option unit unit_struct
539 newtype_struct seq tuple tuple_struct map
struct enum identifier
544 impl<'de
, 'a
> Deserializer
<'de
> for &'a Number
{
547 deserialize_any
!(ref);
549 deserialize_number
!(deserialize_i8
=> visit_i8
);
550 deserialize_number
!(deserialize_i16
=> visit_i16
);
551 deserialize_number
!(deserialize_i32
=> visit_i32
);
552 deserialize_number
!(deserialize_i64
=> visit_i64
);
553 deserialize_number
!(deserialize_u8
=> visit_u8
);
554 deserialize_number
!(deserialize_u16
=> visit_u16
);
555 deserialize_number
!(deserialize_u32
=> visit_u32
);
556 deserialize_number
!(deserialize_u64
=> visit_u64
);
557 deserialize_number
!(deserialize_f32
=> visit_f32
);
558 deserialize_number
!(deserialize_f64
=> visit_f64
);
560 serde_if_integer128
! {
561 deserialize_number
!(deserialize_i128
=> visit_i128
);
562 deserialize_number
!(deserialize_u128
=> visit_u128
);
565 forward_to_deserialize_any
! {
566 bool
char str string bytes byte_buf option unit unit_struct
567 newtype_struct seq tuple tuple_struct map
struct enum identifier
572 #[cfg(feature = "arbitrary_precision")]
573 // Not public API. Should be pub(crate).
575 pub struct NumberDeserializer
{
576 pub number
: Option
<String
>,
579 #[cfg(feature = "arbitrary_precision")]
580 impl<'de
> MapAccess
<'de
> for NumberDeserializer
{
583 fn next_key_seed
<K
>(&mut self, seed
: K
) -> Result
<Option
<K
::Value
>, Error
>
585 K
: de
::DeserializeSeed
<'de
>,
587 if self.number
.is_none() {
590 seed
.deserialize(NumberFieldDeserializer
).map(Some
)
593 fn next_value_seed
<V
>(&mut self, seed
: V
) -> Result
<V
::Value
, Error
>
595 V
: de
::DeserializeSeed
<'de
>,
597 seed
.deserialize(self.number
.take().unwrap().into_deserializer())
601 #[cfg(feature = "arbitrary_precision")]
602 struct NumberFieldDeserializer
;
604 #[cfg(feature = "arbitrary_precision")]
605 impl<'de
> Deserializer
<'de
> for NumberFieldDeserializer
{
608 fn deserialize_any
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Error
>
612 visitor
.visit_borrowed_str(TOKEN
)
615 forward_to_deserialize_any
! {
616 bool
u8 u16 u32 u64 u128
i8 i16 i32 i64 i128
f32 f64 char str string seq
617 bytes byte_buf map
struct option unit newtype_struct ignored_any
618 unit_struct tuple_struct tuple
enum identifier
622 impl From
<ParserNumber
> for Number
{
623 fn from(value
: ParserNumber
) -> Self {
624 let n
= match value
{
625 ParserNumber
::F64(f
) => {
626 #[cfg(not(feature = "arbitrary_precision"))]
630 #[cfg(feature = "arbitrary_precision")]
635 ParserNumber
::U64(u
) => {
636 #[cfg(not(feature = "arbitrary_precision"))]
640 #[cfg(feature = "arbitrary_precision")]
645 ParserNumber
::I64(i
) => {
646 #[cfg(not(feature = "arbitrary_precision"))]
650 #[cfg(feature = "arbitrary_precision")]
655 #[cfg(feature = "arbitrary_precision")]
656 ParserNumber
::String(s
) => s
,
662 macro_rules
! impl_from_unsigned
{
667 impl From
<$ty
> for Number
{
669 fn from(u
: $ty
) -> Self {
671 #[cfg(not(feature = "arbitrary_precision"))]
672 { N::PosInt(u as u64) }
673 #[cfg(feature = "arbitrary_precision")]
675 itoa
::Buffer
::new().format(u
).to_owned()
685 macro_rules
! impl_from_signed
{
690 impl From
<$ty
> for Number
{
692 fn from(i
: $ty
) -> Self {
694 #[cfg(not(feature = "arbitrary_precision"))]
702 #[cfg(feature = "arbitrary_precision")]
704 itoa
::Buffer
::new().format(i
).to_owned()
714 impl_from_unsigned
!(u8, u16, u32, u64, usize);
715 impl_from_signed
!(i8, i16, i32, i64, isize);
717 #[cfg(feature = "arbitrary_precision")]
718 serde_if_integer128
! {
719 impl From
<i128
> for Number
{
720 fn from(i
: i128
) -> Self {
721 Number { n: i.to_string() }
725 impl From
<u128
> for Number
{
726 fn from(u
: u128
) -> Self {
727 Number { n: u.to_string() }
733 #[cfg(not(feature = "arbitrary_precision"))]
734 // Not public API. Should be pub(crate).
737 pub fn unexpected(&self) -> Unexpected
{
739 N
::PosInt(u
) => Unexpected
::Unsigned(u
),
740 N
::NegInt(i
) => Unexpected
::Signed(i
),
741 N
::Float(f
) => Unexpected
::Float(f
),
745 #[cfg(feature = "arbitrary_precision")]
746 // Not public API. Should be pub(crate).
749 pub fn unexpected(&self) -> Unexpected
{
750 Unexpected
::Other("number")