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