Coverage Report

Created: 2026-05-16 06:08

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/serde_json-1.0.82/src/number.rs
Line
Count
Source
1
use crate::de::ParserNumber;
2
use crate::error::Error;
3
use core::fmt::{self, Debug, Display};
4
#[cfg(not(feature = "arbitrary_precision"))]
5
use core::hash::{Hash, Hasher};
6
use serde::de::{self, Unexpected, Visitor};
7
use serde::{
8
    forward_to_deserialize_any, serde_if_integer128, Deserialize, Deserializer, Serialize,
9
    Serializer,
10
};
11
12
#[cfg(feature = "arbitrary_precision")]
13
use crate::error::ErrorCode;
14
#[cfg(feature = "arbitrary_precision")]
15
use serde::de::{IntoDeserializer, MapAccess};
16
17
#[cfg(feature = "arbitrary_precision")]
18
pub(crate) const TOKEN: &str = "$serde_json::private::Number";
19
20
/// Represents a JSON number, whether integer or floating point.
21
#[derive(Clone, PartialEq, Eq, Hash)]
22
pub struct Number {
23
    n: N,
24
}
25
26
#[cfg(not(feature = "arbitrary_precision"))]
27
#[derive(Copy, Clone)]
28
enum N {
29
    PosInt(u64),
30
    /// Always less than zero.
31
    NegInt(i64),
32
    /// Always finite.
33
    Float(f64),
34
}
35
36
#[cfg(not(feature = "arbitrary_precision"))]
37
impl PartialEq for N {
38
0
    fn eq(&self, other: &Self) -> bool {
39
0
        match (self, other) {
40
0
            (N::PosInt(a), N::PosInt(b)) => a == b,
41
0
            (N::NegInt(a), N::NegInt(b)) => a == b,
42
0
            (N::Float(a), N::Float(b)) => a == b,
43
0
            _ => false,
44
        }
45
0
    }
46
}
47
48
// Implementing Eq is fine since any float values are always finite.
49
#[cfg(not(feature = "arbitrary_precision"))]
50
impl Eq for N {}
51
52
#[cfg(not(feature = "arbitrary_precision"))]
53
impl Hash for N {
54
0
    fn hash<H: Hasher>(&self, h: &mut H) {
55
0
        match *self {
56
0
            N::PosInt(i) => i.hash(h),
57
0
            N::NegInt(i) => i.hash(h),
58
0
            N::Float(f) => {
59
0
                if f == 0.0f64 {
60
0
                    // There are 2 zero representations, +0 and -0, which
61
0
                    // compare equal but have different bits. We use the +0 hash
62
0
                    // for both so that hash(+0) == hash(-0).
63
0
                    0.0f64.to_bits().hash(h);
64
0
                } else {
65
0
                    f.to_bits().hash(h);
66
0
                }
67
            }
68
        }
69
0
    }
70
}
71
72
#[cfg(feature = "arbitrary_precision")]
73
type N = String;
74
75
impl Number {
76
    /// Returns true if the `Number` is an integer between `i64::MIN` and
77
    /// `i64::MAX`.
78
    ///
79
    /// For any Number on which `is_i64` returns true, `as_i64` is guaranteed to
80
    /// return the integer value.
81
    ///
82
    /// ```
83
    /// # use serde_json::json;
84
    /// #
85
    /// let big = i64::max_value() as u64 + 10;
86
    /// let v = json!({ "a": 64, "b": big, "c": 256.0 });
87
    ///
88
    /// assert!(v["a"].is_i64());
89
    ///
90
    /// // Greater than i64::MAX.
91
    /// assert!(!v["b"].is_i64());
92
    ///
93
    /// // Numbers with a decimal point are not considered integers.
94
    /// assert!(!v["c"].is_i64());
95
    /// ```
96
    #[inline]
97
0
    pub fn is_i64(&self) -> bool {
98
        #[cfg(not(feature = "arbitrary_precision"))]
99
0
        match self.n {
100
0
            N::PosInt(v) => v <= i64::max_value() as u64,
101
0
            N::NegInt(_) => true,
102
0
            N::Float(_) => false,
103
        }
104
        #[cfg(feature = "arbitrary_precision")]
105
        self.as_i64().is_some()
106
0
    }
107
108
    /// Returns true if the `Number` is an integer between zero and `u64::MAX`.
109
    ///
110
    /// For any Number on which `is_u64` returns true, `as_u64` is guaranteed to
111
    /// return the integer value.
112
    ///
113
    /// ```
114
    /// # use serde_json::json;
115
    /// #
116
    /// let v = json!({ "a": 64, "b": -64, "c": 256.0 });
117
    ///
118
    /// assert!(v["a"].is_u64());
119
    ///
120
    /// // Negative integer.
121
    /// assert!(!v["b"].is_u64());
122
    ///
123
    /// // Numbers with a decimal point are not considered integers.
124
    /// assert!(!v["c"].is_u64());
125
    /// ```
126
    #[inline]
127
0
    pub fn is_u64(&self) -> bool {
128
        #[cfg(not(feature = "arbitrary_precision"))]
129
0
        match self.n {
130
0
            N::PosInt(_) => true,
131
0
            N::NegInt(_) | N::Float(_) => false,
132
        }
133
        #[cfg(feature = "arbitrary_precision")]
134
        self.as_u64().is_some()
135
0
    }
136
137
    /// Returns true if the `Number` can be represented by f64.
138
    ///
139
    /// For any Number on which `is_f64` returns true, `as_f64` is guaranteed to
140
    /// return the floating point value.
141
    ///
142
    /// Currently this function returns true if and only if both `is_i64` and
143
    /// `is_u64` return false but this is not a guarantee in the future.
144
    ///
145
    /// ```
146
    /// # use serde_json::json;
147
    /// #
148
    /// let v = json!({ "a": 256.0, "b": 64, "c": -64 });
149
    ///
150
    /// assert!(v["a"].is_f64());
151
    ///
152
    /// // Integers.
153
    /// assert!(!v["b"].is_f64());
154
    /// assert!(!v["c"].is_f64());
155
    /// ```
156
    #[inline]
157
0
    pub fn is_f64(&self) -> bool {
158
        #[cfg(not(feature = "arbitrary_precision"))]
159
0
        match self.n {
160
0
            N::Float(_) => true,
161
0
            N::PosInt(_) | N::NegInt(_) => false,
162
        }
163
        #[cfg(feature = "arbitrary_precision")]
164
        {
165
            for c in self.n.chars() {
166
                if c == '.' || c == 'e' || c == 'E' {
167
                    return self.n.parse::<f64>().ok().map_or(false, f64::is_finite);
168
                }
169
            }
170
            false
171
        }
172
0
    }
173
174
    /// If the `Number` is an integer, represent it as i64 if possible. Returns
175
    /// None otherwise.
176
    ///
177
    /// ```
178
    /// # use serde_json::json;
179
    /// #
180
    /// let big = i64::max_value() as u64 + 10;
181
    /// let v = json!({ "a": 64, "b": big, "c": 256.0 });
182
    ///
183
    /// assert_eq!(v["a"].as_i64(), Some(64));
184
    /// assert_eq!(v["b"].as_i64(), None);
185
    /// assert_eq!(v["c"].as_i64(), None);
186
    /// ```
187
    #[inline]
188
0
    pub fn as_i64(&self) -> Option<i64> {
189
        #[cfg(not(feature = "arbitrary_precision"))]
190
0
        match self.n {
191
0
            N::PosInt(n) => {
192
0
                if n <= i64::max_value() as u64 {
193
0
                    Some(n as i64)
194
                } else {
195
0
                    None
196
                }
197
            }
198
0
            N::NegInt(n) => Some(n),
199
0
            N::Float(_) => None,
200
        }
201
        #[cfg(feature = "arbitrary_precision")]
202
        self.n.parse().ok()
203
0
    }
204
205
    /// If the `Number` is an integer, represent it as u64 if possible. Returns
206
    /// None otherwise.
207
    ///
208
    /// ```
209
    /// # use serde_json::json;
210
    /// #
211
    /// let v = json!({ "a": 64, "b": -64, "c": 256.0 });
212
    ///
213
    /// assert_eq!(v["a"].as_u64(), Some(64));
214
    /// assert_eq!(v["b"].as_u64(), None);
215
    /// assert_eq!(v["c"].as_u64(), None);
216
    /// ```
217
    #[inline]
218
0
    pub fn as_u64(&self) -> Option<u64> {
219
        #[cfg(not(feature = "arbitrary_precision"))]
220
0
        match self.n {
221
0
            N::PosInt(n) => Some(n),
222
0
            N::NegInt(_) | N::Float(_) => None,
223
        }
224
        #[cfg(feature = "arbitrary_precision")]
225
        self.n.parse().ok()
226
0
    }
227
228
    /// Represents the number as f64 if possible. Returns None otherwise.
229
    ///
230
    /// ```
231
    /// # use serde_json::json;
232
    /// #
233
    /// let v = json!({ "a": 256.0, "b": 64, "c": -64 });
234
    ///
235
    /// assert_eq!(v["a"].as_f64(), Some(256.0));
236
    /// assert_eq!(v["b"].as_f64(), Some(64.0));
237
    /// assert_eq!(v["c"].as_f64(), Some(-64.0));
238
    /// ```
239
    #[inline]
240
0
    pub fn as_f64(&self) -> Option<f64> {
241
        #[cfg(not(feature = "arbitrary_precision"))]
242
0
        match self.n {
243
0
            N::PosInt(n) => Some(n as f64),
244
0
            N::NegInt(n) => Some(n as f64),
245
0
            N::Float(n) => Some(n),
246
        }
247
        #[cfg(feature = "arbitrary_precision")]
248
        self.n.parse::<f64>().ok().filter(|float| float.is_finite())
249
0
    }
250
251
    /// Converts a finite `f64` to a `Number`. Infinite or NaN values are not JSON
252
    /// numbers.
253
    ///
254
    /// ```
255
    /// # use std::f64;
256
    /// #
257
    /// # use serde_json::Number;
258
    /// #
259
    /// assert!(Number::from_f64(256.0).is_some());
260
    ///
261
    /// assert!(Number::from_f64(f64::NAN).is_none());
262
    /// ```
263
    #[inline]
264
0
    pub fn from_f64(f: f64) -> Option<Number> {
265
0
        if f.is_finite() {
266
0
            let n = {
267
                #[cfg(not(feature = "arbitrary_precision"))]
268
                {
269
0
                    N::Float(f)
270
                }
271
                #[cfg(feature = "arbitrary_precision")]
272
                {
273
                    ryu::Buffer::new().format_finite(f).to_owned()
274
                }
275
            };
276
0
            Some(Number { n })
277
        } else {
278
0
            None
279
        }
280
0
    }
281
282
    #[cfg(feature = "arbitrary_precision")]
283
    /// Not public API. Only tests use this.
284
    #[doc(hidden)]
285
    #[inline]
286
    pub fn from_string_unchecked(n: String) -> Self {
287
        Number { n }
288
    }
289
}
290
291
impl Display for Number {
292
    #[cfg(not(feature = "arbitrary_precision"))]
293
0
    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
294
0
        match self.n {
295
0
            N::PosInt(u) => Display::fmt(&u, formatter),
296
0
            N::NegInt(i) => Display::fmt(&i, formatter),
297
0
            N::Float(f) => Display::fmt(&f, formatter),
298
        }
299
0
    }
300
301
    #[cfg(feature = "arbitrary_precision")]
302
    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
303
        Display::fmt(&self.n, formatter)
304
    }
305
}
306
307
impl Debug for Number {
308
    #[cfg(not(feature = "arbitrary_precision"))]
309
0
    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
310
0
        let mut debug = formatter.debug_tuple("Number");
311
0
        match self.n {
312
0
            N::PosInt(i) => {
313
0
                debug.field(&i);
314
0
            }
315
0
            N::NegInt(i) => {
316
0
                debug.field(&i);
317
0
            }
318
0
            N::Float(f) => {
319
0
                debug.field(&f);
320
0
            }
321
        }
322
0
        debug.finish()
323
0
    }
324
325
    #[cfg(feature = "arbitrary_precision")]
326
    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
327
        formatter
328
            .debug_tuple("Number")
329
            .field(&format_args!("{}", self.n))
330
            .finish()
331
    }
332
}
333
334
impl Serialize for Number {
335
    #[cfg(not(feature = "arbitrary_precision"))]
336
    #[inline]
337
0
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
338
0
    where
339
0
        S: Serializer,
340
    {
341
0
        match self.n {
342
0
            N::PosInt(u) => serializer.serialize_u64(u),
343
0
            N::NegInt(i) => serializer.serialize_i64(i),
344
0
            N::Float(f) => serializer.serialize_f64(f),
345
        }
346
0
    }
Unexecuted instantiation: <serde_json::number::Number as serde_core::ser::Serialize>::serialize::<&mut serde_json::ser::Serializer<&mut <serde_json::value::Value as core::fmt::Display>::fmt::WriterFormatter>>
Unexecuted instantiation: <serde_json::number::Number as serde_core::ser::Serialize>::serialize::<&mut serde_json::ser::Serializer<&mut <serde_json::value::Value as core::fmt::Display>::fmt::WriterFormatter, serde_json::ser::PrettyFormatter>>
Unexecuted instantiation: <serde_json::number::Number as serde_core::ser::Serialize>::serialize::<&mut serde_json::ser::Serializer<&mut alloc::vec::Vec<u8>, serde_json::ser::PrettyFormatter>>
Unexecuted instantiation: <serde_json::number::Number as serde_core::ser::Serialize>::serialize::<&mut serde_json::ser::Serializer<&mut std::io::buffered::bufwriter::BufWriter<std::fs::File>>>
347
348
    #[cfg(feature = "arbitrary_precision")]
349
    #[inline]
350
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
351
    where
352
        S: Serializer,
353
    {
354
        use serde::ser::SerializeStruct;
355
356
        let mut s = serializer.serialize_struct(TOKEN, 1)?;
357
        s.serialize_field(TOKEN, &self.n)?;
358
        s.end()
359
    }
360
}
361
362
impl<'de> Deserialize<'de> for Number {
363
    #[inline]
364
0
    fn deserialize<D>(deserializer: D) -> Result<Number, D::Error>
365
0
    where
366
0
        D: Deserializer<'de>,
367
    {
368
        struct NumberVisitor;
369
370
        impl<'de> Visitor<'de> for NumberVisitor {
371
            type Value = Number;
372
373
0
            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
374
0
                formatter.write_str("a JSON number")
375
0
            }
376
377
            #[inline]
378
0
            fn visit_i64<E>(self, value: i64) -> Result<Number, E> {
379
0
                Ok(value.into())
380
0
            }
381
382
            #[inline]
383
0
            fn visit_u64<E>(self, value: u64) -> Result<Number, E> {
384
0
                Ok(value.into())
385
0
            }
386
387
            #[inline]
388
0
            fn visit_f64<E>(self, value: f64) -> Result<Number, E>
389
0
            where
390
0
                E: de::Error,
391
            {
392
0
                Number::from_f64(value).ok_or_else(|| de::Error::custom("not a JSON number"))
393
0
            }
394
395
            #[cfg(feature = "arbitrary_precision")]
396
            #[inline]
397
            fn visit_map<V>(self, mut visitor: V) -> Result<Number, V::Error>
398
            where
399
                V: de::MapAccess<'de>,
400
            {
401
                let value = visitor.next_key::<NumberKey>()?;
402
                if value.is_none() {
403
                    return Err(de::Error::invalid_type(Unexpected::Map, &self));
404
                }
405
                let v: NumberFromString = visitor.next_value()?;
406
                Ok(v.value)
407
            }
408
        }
409
410
0
        deserializer.deserialize_any(NumberVisitor)
411
0
    }
412
}
413
414
#[cfg(feature = "arbitrary_precision")]
415
struct NumberKey;
416
417
#[cfg(feature = "arbitrary_precision")]
418
impl<'de> de::Deserialize<'de> for NumberKey {
419
    fn deserialize<D>(deserializer: D) -> Result<NumberKey, D::Error>
420
    where
421
        D: de::Deserializer<'de>,
422
    {
423
        struct FieldVisitor;
424
425
        impl<'de> de::Visitor<'de> for FieldVisitor {
426
            type Value = ();
427
428
            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
429
                formatter.write_str("a valid number field")
430
            }
431
432
            fn visit_str<E>(self, s: &str) -> Result<(), E>
433
            where
434
                E: de::Error,
435
            {
436
                if s == TOKEN {
437
                    Ok(())
438
                } else {
439
                    Err(de::Error::custom("expected field with custom name"))
440
                }
441
            }
442
        }
443
444
        deserializer.deserialize_identifier(FieldVisitor)?;
445
        Ok(NumberKey)
446
    }
447
}
448
449
#[cfg(feature = "arbitrary_precision")]
450
pub struct NumberFromString {
451
    pub value: Number,
452
}
453
454
#[cfg(feature = "arbitrary_precision")]
455
impl<'de> de::Deserialize<'de> for NumberFromString {
456
    fn deserialize<D>(deserializer: D) -> Result<NumberFromString, D::Error>
457
    where
458
        D: de::Deserializer<'de>,
459
    {
460
        struct Visitor;
461
462
        impl<'de> de::Visitor<'de> for Visitor {
463
            type Value = NumberFromString;
464
465
            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
466
                formatter.write_str("string containing a number")
467
            }
468
469
            fn visit_str<E>(self, s: &str) -> Result<NumberFromString, E>
470
            where
471
                E: de::Error,
472
            {
473
                let n = tri!(s.parse().map_err(de::Error::custom));
474
                Ok(NumberFromString { value: n })
475
            }
476
        }
477
478
        deserializer.deserialize_str(Visitor)
479
    }
480
}
481
482
#[cfg(feature = "arbitrary_precision")]
483
fn invalid_number() -> Error {
484
    Error::syntax(ErrorCode::InvalidNumber, 0, 0)
485
}
486
487
macro_rules! deserialize_any {
488
    (@expand [$($num_string:tt)*]) => {
489
        #[cfg(not(feature = "arbitrary_precision"))]
490
        #[inline]
491
0
        fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error>
492
0
        where
493
0
            V: Visitor<'de>,
494
        {
495
0
            match self.n {
496
0
                N::PosInt(u) => visitor.visit_u64(u),
497
0
                N::NegInt(i) => visitor.visit_i64(i),
498
0
                N::Float(f) => visitor.visit_f64(f),
499
            }
500
0
        }
Unexecuted instantiation: <serde_json::number::Number as serde_core::de::Deserializer>::deserialize_any::<_>
Unexecuted instantiation: <&serde_json::number::Number as serde_core::de::Deserializer>::deserialize_any::<_>
501
502
        #[cfg(feature = "arbitrary_precision")]
503
        #[inline]
504
        fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error>
505
            where V: Visitor<'de>
506
        {
507
            if let Some(u) = self.as_u64() {
508
                return visitor.visit_u64(u);
509
            } else if let Some(i) = self.as_i64() {
510
                return visitor.visit_i64(i);
511
            } else if let Some(f) = self.as_f64() {
512
                if ryu::Buffer::new().format_finite(f) == self.n || f.to_string() == self.n {
513
                    return visitor.visit_f64(f);
514
                }
515
            }
516
517
            visitor.visit_map(NumberDeserializer {
518
                number: Some(self.$($num_string)*),
519
            })
520
        }
521
    };
522
523
    (owned) => {
524
        deserialize_any!(@expand [n]);
525
    };
526
527
    (ref) => {
528
        deserialize_any!(@expand [n.clone()]);
529
    };
530
}
531
532
macro_rules! deserialize_number {
533
    ($deserialize:ident => $visit:ident) => {
534
        #[cfg(not(feature = "arbitrary_precision"))]
535
0
        fn $deserialize<V>(self, visitor: V) -> Result<V::Value, Error>
536
0
        where
537
0
            V: Visitor<'de>,
538
        {
539
0
            self.deserialize_any(visitor)
540
0
        }
Unexecuted instantiation: <serde_json::number::Number as serde_core::de::Deserializer>::deserialize_i8::<_>
Unexecuted instantiation: <serde_json::number::Number as serde_core::de::Deserializer>::deserialize_u8::<_>
Unexecuted instantiation: <serde_json::number::Number as serde_core::de::Deserializer>::deserialize_f32::<_>
Unexecuted instantiation: <serde_json::number::Number as serde_core::de::Deserializer>::deserialize_f64::<_>
Unexecuted instantiation: <serde_json::number::Number as serde_core::de::Deserializer>::deserialize_i16::<_>
Unexecuted instantiation: <serde_json::number::Number as serde_core::de::Deserializer>::deserialize_i32::<_>
Unexecuted instantiation: <serde_json::number::Number as serde_core::de::Deserializer>::deserialize_i64::<_>
Unexecuted instantiation: <serde_json::number::Number as serde_core::de::Deserializer>::deserialize_u16::<_>
Unexecuted instantiation: <serde_json::number::Number as serde_core::de::Deserializer>::deserialize_u32::<_>
Unexecuted instantiation: <serde_json::number::Number as serde_core::de::Deserializer>::deserialize_u64::<_>
Unexecuted instantiation: <serde_json::number::Number as serde_core::de::Deserializer>::deserialize_i128::<_>
Unexecuted instantiation: <serde_json::number::Number as serde_core::de::Deserializer>::deserialize_u128::<_>
Unexecuted instantiation: <&serde_json::number::Number as serde_core::de::Deserializer>::deserialize_i8::<_>
Unexecuted instantiation: <&serde_json::number::Number as serde_core::de::Deserializer>::deserialize_u8::<_>
Unexecuted instantiation: <&serde_json::number::Number as serde_core::de::Deserializer>::deserialize_f32::<_>
Unexecuted instantiation: <&serde_json::number::Number as serde_core::de::Deserializer>::deserialize_f64::<_>
Unexecuted instantiation: <&serde_json::number::Number as serde_core::de::Deserializer>::deserialize_i16::<_>
Unexecuted instantiation: <&serde_json::number::Number as serde_core::de::Deserializer>::deserialize_i32::<_>
Unexecuted instantiation: <&serde_json::number::Number as serde_core::de::Deserializer>::deserialize_i64::<_>
Unexecuted instantiation: <&serde_json::number::Number as serde_core::de::Deserializer>::deserialize_u16::<_>
Unexecuted instantiation: <&serde_json::number::Number as serde_core::de::Deserializer>::deserialize_u32::<_>
Unexecuted instantiation: <&serde_json::number::Number as serde_core::de::Deserializer>::deserialize_u64::<_>
Unexecuted instantiation: <&serde_json::number::Number as serde_core::de::Deserializer>::deserialize_i128::<_>
Unexecuted instantiation: <&serde_json::number::Number as serde_core::de::Deserializer>::deserialize_u128::<_>
541
542
        #[cfg(feature = "arbitrary_precision")]
543
        fn $deserialize<V>(self, visitor: V) -> Result<V::Value, Error>
544
        where
545
            V: de::Visitor<'de>,
546
        {
547
            visitor.$visit(self.n.parse().map_err(|_| invalid_number())?)
548
        }
549
    };
550
}
551
552
impl<'de> Deserializer<'de> for Number {
553
    type Error = Error;
554
555
    deserialize_any!(owned);
556
557
    deserialize_number!(deserialize_i8 => visit_i8);
558
    deserialize_number!(deserialize_i16 => visit_i16);
559
    deserialize_number!(deserialize_i32 => visit_i32);
560
    deserialize_number!(deserialize_i64 => visit_i64);
561
    deserialize_number!(deserialize_u8 => visit_u8);
562
    deserialize_number!(deserialize_u16 => visit_u16);
563
    deserialize_number!(deserialize_u32 => visit_u32);
564
    deserialize_number!(deserialize_u64 => visit_u64);
565
    deserialize_number!(deserialize_f32 => visit_f32);
566
    deserialize_number!(deserialize_f64 => visit_f64);
567
568
    serde_if_integer128! {
569
        deserialize_number!(deserialize_i128 => visit_i128);
570
        deserialize_number!(deserialize_u128 => visit_u128);
571
    }
572
573
    forward_to_deserialize_any! {
574
        bool char str string bytes byte_buf option unit unit_struct
575
        newtype_struct seq tuple tuple_struct map struct enum identifier
576
        ignored_any
577
    }
578
}
579
580
impl<'de, 'a> Deserializer<'de> for &'a Number {
581
    type Error = Error;
582
583
    deserialize_any!(ref);
584
585
    deserialize_number!(deserialize_i8 => visit_i8);
586
    deserialize_number!(deserialize_i16 => visit_i16);
587
    deserialize_number!(deserialize_i32 => visit_i32);
588
    deserialize_number!(deserialize_i64 => visit_i64);
589
    deserialize_number!(deserialize_u8 => visit_u8);
590
    deserialize_number!(deserialize_u16 => visit_u16);
591
    deserialize_number!(deserialize_u32 => visit_u32);
592
    deserialize_number!(deserialize_u64 => visit_u64);
593
    deserialize_number!(deserialize_f32 => visit_f32);
594
    deserialize_number!(deserialize_f64 => visit_f64);
595
596
    serde_if_integer128! {
597
        deserialize_number!(deserialize_i128 => visit_i128);
598
        deserialize_number!(deserialize_u128 => visit_u128);
599
    }
600
601
    forward_to_deserialize_any! {
602
        bool char str string bytes byte_buf option unit unit_struct
603
        newtype_struct seq tuple tuple_struct map struct enum identifier
604
        ignored_any
605
    }
606
}
607
608
#[cfg(feature = "arbitrary_precision")]
609
pub(crate) struct NumberDeserializer {
610
    pub number: Option<String>,
611
}
612
613
#[cfg(feature = "arbitrary_precision")]
614
impl<'de> MapAccess<'de> for NumberDeserializer {
615
    type Error = Error;
616
617
    fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Error>
618
    where
619
        K: de::DeserializeSeed<'de>,
620
    {
621
        if self.number.is_none() {
622
            return Ok(None);
623
        }
624
        seed.deserialize(NumberFieldDeserializer).map(Some)
625
    }
626
627
    fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Error>
628
    where
629
        V: de::DeserializeSeed<'de>,
630
    {
631
        seed.deserialize(self.number.take().unwrap().into_deserializer())
632
    }
633
}
634
635
#[cfg(feature = "arbitrary_precision")]
636
struct NumberFieldDeserializer;
637
638
#[cfg(feature = "arbitrary_precision")]
639
impl<'de> Deserializer<'de> for NumberFieldDeserializer {
640
    type Error = Error;
641
642
    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error>
643
    where
644
        V: de::Visitor<'de>,
645
    {
646
        visitor.visit_borrowed_str(TOKEN)
647
    }
648
649
    forward_to_deserialize_any! {
650
        bool u8 u16 u32 u64 u128 i8 i16 i32 i64 i128 f32 f64 char str string seq
651
        bytes byte_buf map struct option unit newtype_struct ignored_any
652
        unit_struct tuple_struct tuple enum identifier
653
    }
654
}
655
656
impl From<ParserNumber> for Number {
657
0
    fn from(value: ParserNumber) -> Self {
658
0
        let n = match value {
659
0
            ParserNumber::F64(f) => {
660
                #[cfg(not(feature = "arbitrary_precision"))]
661
                {
662
0
                    N::Float(f)
663
                }
664
                #[cfg(feature = "arbitrary_precision")]
665
                {
666
                    f.to_string()
667
                }
668
            }
669
0
            ParserNumber::U64(u) => {
670
                #[cfg(not(feature = "arbitrary_precision"))]
671
                {
672
0
                    N::PosInt(u)
673
                }
674
                #[cfg(feature = "arbitrary_precision")]
675
                {
676
                    u.to_string()
677
                }
678
            }
679
0
            ParserNumber::I64(i) => {
680
                #[cfg(not(feature = "arbitrary_precision"))]
681
                {
682
0
                    N::NegInt(i)
683
                }
684
                #[cfg(feature = "arbitrary_precision")]
685
                {
686
                    i.to_string()
687
                }
688
            }
689
            #[cfg(feature = "arbitrary_precision")]
690
            ParserNumber::String(s) => s,
691
        };
692
0
        Number { n }
693
0
    }
694
}
695
696
macro_rules! impl_from_unsigned {
697
    (
698
        $($ty:ty),*
699
    ) => {
700
        $(
701
            impl From<$ty> for Number {
702
                #[inline]
703
0
                fn from(u: $ty) -> Self {
704
0
                    let n = {
705
                        #[cfg(not(feature = "arbitrary_precision"))]
706
0
                        { N::PosInt(u as u64) }
707
                        #[cfg(feature = "arbitrary_precision")]
708
                        {
709
                            itoa::Buffer::new().format(u).to_owned()
710
                        }
711
                    };
712
0
                    Number { n }
713
0
                }
Unexecuted instantiation: <serde_json::number::Number as core::convert::From<u8>>::from
Unexecuted instantiation: <serde_json::number::Number as core::convert::From<u16>>::from
Unexecuted instantiation: <serde_json::number::Number as core::convert::From<u32>>::from
Unexecuted instantiation: <serde_json::number::Number as core::convert::From<u64>>::from
Unexecuted instantiation: <serde_json::number::Number as core::convert::From<usize>>::from
714
            }
715
        )*
716
    };
717
}
718
719
macro_rules! impl_from_signed {
720
    (
721
        $($ty:ty),*
722
    ) => {
723
        $(
724
            impl From<$ty> for Number {
725
                #[inline]
726
0
                fn from(i: $ty) -> Self {
727
0
                    let n = {
728
                        #[cfg(not(feature = "arbitrary_precision"))]
729
                        {
730
0
                            if i < 0 {
731
0
                                N::NegInt(i as i64)
732
                            } else {
733
0
                                N::PosInt(i as u64)
734
                            }
735
                        }
736
                        #[cfg(feature = "arbitrary_precision")]
737
                        {
738
                            itoa::Buffer::new().format(i).to_owned()
739
                        }
740
                    };
741
0
                    Number { n }
742
0
                }
Unexecuted instantiation: <serde_json::number::Number as core::convert::From<i8>>::from
Unexecuted instantiation: <serde_json::number::Number as core::convert::From<i16>>::from
Unexecuted instantiation: <serde_json::number::Number as core::convert::From<i32>>::from
Unexecuted instantiation: <serde_json::number::Number as core::convert::From<i64>>::from
Unexecuted instantiation: <serde_json::number::Number as core::convert::From<isize>>::from
743
            }
744
        )*
745
    };
746
}
747
748
impl_from_unsigned!(u8, u16, u32, u64, usize);
749
impl_from_signed!(i8, i16, i32, i64, isize);
750
751
#[cfg(feature = "arbitrary_precision")]
752
serde_if_integer128! {
753
    impl From<i128> for Number {
754
        fn from(i: i128) -> Self {
755
            Number { n: i.to_string() }
756
        }
757
    }
758
759
    impl From<u128> for Number {
760
        fn from(u: u128) -> Self {
761
            Number { n: u.to_string() }
762
        }
763
    }
764
}
765
766
impl Number {
767
    #[cfg(not(feature = "arbitrary_precision"))]
768
    #[cold]
769
0
    pub(crate) fn unexpected(&self) -> Unexpected {
770
0
        match self.n {
771
0
            N::PosInt(u) => Unexpected::Unsigned(u),
772
0
            N::NegInt(i) => Unexpected::Signed(i),
773
0
            N::Float(f) => Unexpected::Float(f),
774
        }
775
0
    }
776
777
    #[cfg(feature = "arbitrary_precision")]
778
    #[cold]
779
    pub(crate) fn unexpected(&self) -> Unexpected {
780
        Unexpected::Other("number")
781
    }
782
}