• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 use crate::de::ParserNumber;
2 use crate::error::Error;
3 #[cfg(feature = "arbitrary_precision")]
4 use crate::error::ErrorCode;
5 #[cfg(feature = "arbitrary_precision")]
6 use alloc::borrow::ToOwned;
7 #[cfg(feature = "arbitrary_precision")]
8 use alloc::string::{String, ToString};
9 use core::fmt::{self, Debug, Display};
10 #[cfg(not(feature = "arbitrary_precision"))]
11 use core::hash::{Hash, Hasher};
12 use serde::de::{self, Unexpected, Visitor};
13 #[cfg(feature = "arbitrary_precision")]
14 use serde::de::{IntoDeserializer, MapAccess};
15 use serde::{forward_to_deserialize_any, Deserialize, Deserializer, Serialize, Serializer};
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 {
eq(&self, other: &Self) -> bool38     fn eq(&self, other: &Self) -> bool {
39         match (self, other) {
40             (N::PosInt(a), N::PosInt(b)) => a == b,
41             (N::NegInt(a), N::NegInt(b)) => a == b,
42             (N::Float(a), N::Float(b)) => a == b,
43             _ => false,
44         }
45     }
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 {
hash<H: Hasher>(&self, h: &mut H)54     fn hash<H: Hasher>(&self, h: &mut H) {
55         match *self {
56             N::PosInt(i) => i.hash(h),
57             N::NegInt(i) => i.hash(h),
58             N::Float(f) => {
59                 if f == 0.0f64 {
60                     // There are 2 zero representations, +0 and -0, which
61                     // compare equal but have different bits. We use the +0 hash
62                     // for both so that hash(+0) == hash(-0).
63                     0.0f64.to_bits().hash(h);
64                 } else {
65                     f.to_bits().hash(h);
66                 }
67             }
68         }
69     }
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]
is_i64(&self) -> bool97     pub fn is_i64(&self) -> bool {
98         #[cfg(not(feature = "arbitrary_precision"))]
99         match self.n {
100             N::PosInt(v) => v <= i64::max_value() as u64,
101             N::NegInt(_) => true,
102             N::Float(_) => false,
103         }
104         #[cfg(feature = "arbitrary_precision")]
105         self.as_i64().is_some()
106     }
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]
is_u64(&self) -> bool127     pub fn is_u64(&self) -> bool {
128         #[cfg(not(feature = "arbitrary_precision"))]
129         match self.n {
130             N::PosInt(_) => true,
131             N::NegInt(_) | N::Float(_) => false,
132         }
133         #[cfg(feature = "arbitrary_precision")]
134         self.as_u64().is_some()
135     }
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]
is_f64(&self) -> bool157     pub fn is_f64(&self) -> bool {
158         #[cfg(not(feature = "arbitrary_precision"))]
159         match self.n {
160             N::Float(_) => true,
161             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     }
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]
as_i64(&self) -> Option<i64>188     pub fn as_i64(&self) -> Option<i64> {
189         #[cfg(not(feature = "arbitrary_precision"))]
190         match self.n {
191             N::PosInt(n) => {
192                 if n <= i64::max_value() as u64 {
193                     Some(n as i64)
194                 } else {
195                     None
196                 }
197             }
198             N::NegInt(n) => Some(n),
199             N::Float(_) => None,
200         }
201         #[cfg(feature = "arbitrary_precision")]
202         self.n.parse().ok()
203     }
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]
as_u64(&self) -> Option<u64>218     pub fn as_u64(&self) -> Option<u64> {
219         #[cfg(not(feature = "arbitrary_precision"))]
220         match self.n {
221             N::PosInt(n) => Some(n),
222             N::NegInt(_) | N::Float(_) => None,
223         }
224         #[cfg(feature = "arbitrary_precision")]
225         self.n.parse().ok()
226     }
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]
as_f64(&self) -> Option<f64>240     pub fn as_f64(&self) -> Option<f64> {
241         #[cfg(not(feature = "arbitrary_precision"))]
242         match self.n {
243             N::PosInt(n) => Some(n as f64),
244             N::NegInt(n) => Some(n as f64),
245             N::Float(n) => Some(n),
246         }
247         #[cfg(feature = "arbitrary_precision")]
248         self.n.parse::<f64>().ok().filter(|float| float.is_finite())
249     }
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]
from_f64(f: f64) -> Option<Number>264     pub fn from_f64(f: f64) -> Option<Number> {
265         if f.is_finite() {
266             let n = {
267                 #[cfg(not(feature = "arbitrary_precision"))]
268                 {
269                     N::Float(f)
270                 }
271                 #[cfg(feature = "arbitrary_precision")]
272                 {
273                     ryu::Buffer::new().format_finite(f).to_owned()
274                 }
275             };
276             Some(Number { n })
277         } else {
278             None
279         }
280     }
281 
282     #[cfg(feature = "arbitrary_precision")]
283     /// Not public API. Only tests use this.
284     #[doc(hidden)]
285     #[inline]
from_string_unchecked(n: String) -> Self286     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"))]
fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result293     fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
294         match self.n {
295             N::PosInt(u) => formatter.write_str(itoa::Buffer::new().format(u)),
296             N::NegInt(i) => formatter.write_str(itoa::Buffer::new().format(i)),
297             N::Float(f) => formatter.write_str(ryu::Buffer::new().format_finite(f)),
298         }
299     }
300 
301     #[cfg(feature = "arbitrary_precision")]
fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result302     fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
303         Display::fmt(&self.n, formatter)
304     }
305 }
306 
307 impl Debug for Number {
fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result308     fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
309         write!(formatter, "Number({})", self)
310     }
311 }
312 
313 impl Serialize for Number {
314     #[cfg(not(feature = "arbitrary_precision"))]
315     #[inline]
serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer,316     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
317     where
318         S: Serializer,
319     {
320         match self.n {
321             N::PosInt(u) => serializer.serialize_u64(u),
322             N::NegInt(i) => serializer.serialize_i64(i),
323             N::Float(f) => serializer.serialize_f64(f),
324         }
325     }
326 
327     #[cfg(feature = "arbitrary_precision")]
328     #[inline]
serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer,329     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
330     where
331         S: Serializer,
332     {
333         use serde::ser::SerializeStruct;
334 
335         let mut s = serializer.serialize_struct(TOKEN, 1)?;
336         s.serialize_field(TOKEN, &self.n)?;
337         s.end()
338     }
339 }
340 
341 impl<'de> Deserialize<'de> for Number {
342     #[inline]
deserialize<D>(deserializer: D) -> Result<Number, D::Error> where D: Deserializer<'de>,343     fn deserialize<D>(deserializer: D) -> Result<Number, D::Error>
344     where
345         D: Deserializer<'de>,
346     {
347         struct NumberVisitor;
348 
349         impl<'de> Visitor<'de> for NumberVisitor {
350             type Value = Number;
351 
352             fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
353                 formatter.write_str("a JSON number")
354             }
355 
356             #[inline]
357             fn visit_i64<E>(self, value: i64) -> Result<Number, E> {
358                 Ok(value.into())
359             }
360 
361             #[inline]
362             fn visit_u64<E>(self, value: u64) -> Result<Number, E> {
363                 Ok(value.into())
364             }
365 
366             #[inline]
367             fn visit_f64<E>(self, value: f64) -> Result<Number, E>
368             where
369                 E: de::Error,
370             {
371                 Number::from_f64(value).ok_or_else(|| de::Error::custom("not a JSON number"))
372             }
373 
374             #[cfg(feature = "arbitrary_precision")]
375             #[inline]
376             fn visit_map<V>(self, mut visitor: V) -> Result<Number, V::Error>
377             where
378                 V: de::MapAccess<'de>,
379             {
380                 let value = visitor.next_key::<NumberKey>()?;
381                 if value.is_none() {
382                     return Err(de::Error::invalid_type(Unexpected::Map, &self));
383                 }
384                 let v: NumberFromString = visitor.next_value()?;
385                 Ok(v.value)
386             }
387         }
388 
389         deserializer.deserialize_any(NumberVisitor)
390     }
391 }
392 
393 #[cfg(feature = "arbitrary_precision")]
394 struct NumberKey;
395 
396 #[cfg(feature = "arbitrary_precision")]
397 impl<'de> de::Deserialize<'de> for NumberKey {
deserialize<D>(deserializer: D) -> Result<NumberKey, D::Error> where D: de::Deserializer<'de>,398     fn deserialize<D>(deserializer: D) -> Result<NumberKey, D::Error>
399     where
400         D: de::Deserializer<'de>,
401     {
402         struct FieldVisitor;
403 
404         impl<'de> de::Visitor<'de> for FieldVisitor {
405             type Value = ();
406 
407             fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
408                 formatter.write_str("a valid number field")
409             }
410 
411             fn visit_str<E>(self, s: &str) -> Result<(), E>
412             where
413                 E: de::Error,
414             {
415                 if s == TOKEN {
416                     Ok(())
417                 } else {
418                     Err(de::Error::custom("expected field with custom name"))
419                 }
420             }
421         }
422 
423         deserializer.deserialize_identifier(FieldVisitor)?;
424         Ok(NumberKey)
425     }
426 }
427 
428 #[cfg(feature = "arbitrary_precision")]
429 pub struct NumberFromString {
430     pub value: Number,
431 }
432 
433 #[cfg(feature = "arbitrary_precision")]
434 impl<'de> de::Deserialize<'de> for NumberFromString {
deserialize<D>(deserializer: D) -> Result<NumberFromString, D::Error> where D: de::Deserializer<'de>,435     fn deserialize<D>(deserializer: D) -> Result<NumberFromString, D::Error>
436     where
437         D: de::Deserializer<'de>,
438     {
439         struct Visitor;
440 
441         impl<'de> de::Visitor<'de> for Visitor {
442             type Value = NumberFromString;
443 
444             fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
445                 formatter.write_str("string containing a number")
446             }
447 
448             fn visit_str<E>(self, s: &str) -> Result<NumberFromString, E>
449             where
450                 E: de::Error,
451             {
452                 let n = tri!(s.parse().map_err(de::Error::custom));
453                 Ok(NumberFromString { value: n })
454             }
455         }
456 
457         deserializer.deserialize_str(Visitor)
458     }
459 }
460 
461 #[cfg(feature = "arbitrary_precision")]
invalid_number() -> Error462 fn invalid_number() -> Error {
463     Error::syntax(ErrorCode::InvalidNumber, 0, 0)
464 }
465 
466 macro_rules! deserialize_any {
467     (@expand [$($num_string:tt)*]) => {
468         #[cfg(not(feature = "arbitrary_precision"))]
469         #[inline]
470         fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error>
471         where
472             V: Visitor<'de>,
473         {
474             match self.n {
475                 N::PosInt(u) => visitor.visit_u64(u),
476                 N::NegInt(i) => visitor.visit_i64(i),
477                 N::Float(f) => visitor.visit_f64(f),
478             }
479         }
480 
481         #[cfg(feature = "arbitrary_precision")]
482         #[inline]
483         fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error>
484             where V: Visitor<'de>
485         {
486             if let Some(u) = self.as_u64() {
487                 return visitor.visit_u64(u);
488             } else if let Some(i) = self.as_i64() {
489                 return visitor.visit_i64(i);
490             } else if let Some(f) = self.as_f64() {
491                 if ryu::Buffer::new().format_finite(f) == self.n || f.to_string() == self.n {
492                     return visitor.visit_f64(f);
493                 }
494             }
495 
496             visitor.visit_map(NumberDeserializer {
497                 number: Some(self.$($num_string)*),
498             })
499         }
500     };
501 
502     (owned) => {
503         deserialize_any!(@expand [n]);
504     };
505 
506     (ref) => {
507         deserialize_any!(@expand [n.clone()]);
508     };
509 }
510 
511 macro_rules! deserialize_number {
512     ($deserialize:ident => $visit:ident) => {
513         #[cfg(not(feature = "arbitrary_precision"))]
514         fn $deserialize<V>(self, visitor: V) -> Result<V::Value, Error>
515         where
516             V: Visitor<'de>,
517         {
518             self.deserialize_any(visitor)
519         }
520 
521         #[cfg(feature = "arbitrary_precision")]
522         fn $deserialize<V>(self, visitor: V) -> Result<V::Value, Error>
523         where
524             V: de::Visitor<'de>,
525         {
526             visitor.$visit(self.n.parse().map_err(|_| invalid_number())?)
527         }
528     };
529 }
530 
531 impl<'de> Deserializer<'de> for Number {
532     type Error = Error;
533 
534     deserialize_any!(owned);
535 
536     deserialize_number!(deserialize_i8 => visit_i8);
537     deserialize_number!(deserialize_i16 => visit_i16);
538     deserialize_number!(deserialize_i32 => visit_i32);
539     deserialize_number!(deserialize_i64 => visit_i64);
540     deserialize_number!(deserialize_i128 => visit_i128);
541     deserialize_number!(deserialize_u8 => visit_u8);
542     deserialize_number!(deserialize_u16 => visit_u16);
543     deserialize_number!(deserialize_u32 => visit_u32);
544     deserialize_number!(deserialize_u64 => visit_u64);
545     deserialize_number!(deserialize_u128 => visit_u128);
546     deserialize_number!(deserialize_f32 => visit_f32);
547     deserialize_number!(deserialize_f64 => visit_f64);
548 
549     forward_to_deserialize_any! {
550         bool char str string bytes byte_buf option unit unit_struct
551         newtype_struct seq tuple tuple_struct map struct enum identifier
552         ignored_any
553     }
554 }
555 
556 impl<'de, 'a> Deserializer<'de> for &'a Number {
557     type Error = Error;
558 
559     deserialize_any!(ref);
560 
561     deserialize_number!(deserialize_i8 => visit_i8);
562     deserialize_number!(deserialize_i16 => visit_i16);
563     deserialize_number!(deserialize_i32 => visit_i32);
564     deserialize_number!(deserialize_i64 => visit_i64);
565     deserialize_number!(deserialize_i128 => visit_i128);
566     deserialize_number!(deserialize_u8 => visit_u8);
567     deserialize_number!(deserialize_u16 => visit_u16);
568     deserialize_number!(deserialize_u32 => visit_u32);
569     deserialize_number!(deserialize_u64 => visit_u64);
570     deserialize_number!(deserialize_u128 => visit_u128);
571     deserialize_number!(deserialize_f32 => visit_f32);
572     deserialize_number!(deserialize_f64 => visit_f64);
573 
574     forward_to_deserialize_any! {
575         bool char str string bytes byte_buf option unit unit_struct
576         newtype_struct seq tuple tuple_struct map struct enum identifier
577         ignored_any
578     }
579 }
580 
581 #[cfg(feature = "arbitrary_precision")]
582 pub(crate) struct NumberDeserializer {
583     pub number: Option<String>,
584 }
585 
586 #[cfg(feature = "arbitrary_precision")]
587 impl<'de> MapAccess<'de> for NumberDeserializer {
588     type Error = Error;
589 
next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Error> where K: de::DeserializeSeed<'de>,590     fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Error>
591     where
592         K: de::DeserializeSeed<'de>,
593     {
594         if self.number.is_none() {
595             return Ok(None);
596         }
597         seed.deserialize(NumberFieldDeserializer).map(Some)
598     }
599 
next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Error> where V: de::DeserializeSeed<'de>,600     fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Error>
601     where
602         V: de::DeserializeSeed<'de>,
603     {
604         seed.deserialize(self.number.take().unwrap().into_deserializer())
605     }
606 }
607 
608 #[cfg(feature = "arbitrary_precision")]
609 struct NumberFieldDeserializer;
610 
611 #[cfg(feature = "arbitrary_precision")]
612 impl<'de> Deserializer<'de> for NumberFieldDeserializer {
613     type Error = Error;
614 
deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error> where V: de::Visitor<'de>,615     fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error>
616     where
617         V: de::Visitor<'de>,
618     {
619         visitor.visit_borrowed_str(TOKEN)
620     }
621 
622     forward_to_deserialize_any! {
623         bool u8 u16 u32 u64 u128 i8 i16 i32 i64 i128 f32 f64 char str string seq
624         bytes byte_buf map struct option unit newtype_struct ignored_any
625         unit_struct tuple_struct tuple enum identifier
626     }
627 }
628 
629 impl From<ParserNumber> for Number {
from(value: ParserNumber) -> Self630     fn from(value: ParserNumber) -> Self {
631         let n = match value {
632             ParserNumber::F64(f) => {
633                 #[cfg(not(feature = "arbitrary_precision"))]
634                 {
635                     N::Float(f)
636                 }
637                 #[cfg(feature = "arbitrary_precision")]
638                 {
639                     f.to_string()
640                 }
641             }
642             ParserNumber::U64(u) => {
643                 #[cfg(not(feature = "arbitrary_precision"))]
644                 {
645                     N::PosInt(u)
646                 }
647                 #[cfg(feature = "arbitrary_precision")]
648                 {
649                     u.to_string()
650                 }
651             }
652             ParserNumber::I64(i) => {
653                 #[cfg(not(feature = "arbitrary_precision"))]
654                 {
655                     N::NegInt(i)
656                 }
657                 #[cfg(feature = "arbitrary_precision")]
658                 {
659                     i.to_string()
660                 }
661             }
662             #[cfg(feature = "arbitrary_precision")]
663             ParserNumber::String(s) => s,
664         };
665         Number { n }
666     }
667 }
668 
669 macro_rules! impl_from_unsigned {
670     (
671         $($ty:ty),*
672     ) => {
673         $(
674             impl From<$ty> for Number {
675                 #[inline]
676                 fn from(u: $ty) -> Self {
677                     let n = {
678                         #[cfg(not(feature = "arbitrary_precision"))]
679                         { N::PosInt(u as u64) }
680                         #[cfg(feature = "arbitrary_precision")]
681                         {
682                             itoa::Buffer::new().format(u).to_owned()
683                         }
684                     };
685                     Number { n }
686                 }
687             }
688         )*
689     };
690 }
691 
692 macro_rules! impl_from_signed {
693     (
694         $($ty:ty),*
695     ) => {
696         $(
697             impl From<$ty> for Number {
698                 #[inline]
699                 fn from(i: $ty) -> Self {
700                     let n = {
701                         #[cfg(not(feature = "arbitrary_precision"))]
702                         {
703                             if i < 0 {
704                                 N::NegInt(i as i64)
705                             } else {
706                                 N::PosInt(i as u64)
707                             }
708                         }
709                         #[cfg(feature = "arbitrary_precision")]
710                         {
711                             itoa::Buffer::new().format(i).to_owned()
712                         }
713                     };
714                     Number { n }
715                 }
716             }
717         )*
718     };
719 }
720 
721 impl_from_unsigned!(u8, u16, u32, u64, usize);
722 impl_from_signed!(i8, i16, i32, i64, isize);
723 
724 #[cfg(feature = "arbitrary_precision")]
725 impl_from_unsigned!(u128);
726 #[cfg(feature = "arbitrary_precision")]
727 impl_from_signed!(i128);
728 
729 impl Number {
730     #[cfg(not(feature = "arbitrary_precision"))]
731     #[cold]
unexpected(&self) -> Unexpected732     pub(crate) fn unexpected(&self) -> Unexpected {
733         match self.n {
734             N::PosInt(u) => Unexpected::Unsigned(u),
735             N::NegInt(i) => Unexpected::Signed(i),
736             N::Float(f) => Unexpected::Float(f),
737         }
738     }
739 
740     #[cfg(feature = "arbitrary_precision")]
741     #[cold]
unexpected(&self) -> Unexpected742     pub(crate) fn unexpected(&self) -> Unexpected {
743         Unexpected::Other("number")
744     }
745 }
746