/rust/registry/src/index.crates.io-1949cf8c6b5b557f/fixed_decimal-0.5.6/src/integer.rs
Line | Count | Source |
1 | | // This file is part of ICU4X. For terms of use, please see the file |
2 | | // called LICENSE at the top level of the ICU4X source tree |
3 | | // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ). |
4 | | |
5 | | use core::convert::TryFrom; |
6 | | use core::fmt; |
7 | | |
8 | | use core::str::FromStr; |
9 | | |
10 | | use crate::Error; |
11 | | use crate::FixedDecimal; |
12 | | |
13 | | /// A [`FixedInteger`] is a [`FixedDecimal`] with no fractional part. |
14 | | /// |
15 | | /// |
16 | | /// # Examples |
17 | | /// |
18 | | /// ``` |
19 | | /// # use std::str::FromStr; |
20 | | /// use fixed_decimal::Error; |
21 | | /// use fixed_decimal::FixedDecimal; |
22 | | /// use fixed_decimal::FixedInteger; |
23 | | /// |
24 | | /// assert_eq!( |
25 | | /// FixedDecimal::from(FixedInteger::from(5)), |
26 | | /// FixedDecimal::from(5) |
27 | | /// ); |
28 | | /// assert_eq!( |
29 | | /// FixedInteger::try_from(FixedDecimal::from(5)), |
30 | | /// Ok(FixedInteger::from(5)) |
31 | | /// ); |
32 | | /// assert_eq!( |
33 | | /// FixedInteger::try_from(FixedDecimal::from_str("05").unwrap()), |
34 | | /// Ok(FixedInteger::from_str("05").unwrap()) |
35 | | /// ); |
36 | | /// assert_eq!( |
37 | | /// FixedInteger::try_from(FixedDecimal::from_str("5.0").unwrap()), |
38 | | /// Err(Error::Limit) |
39 | | /// ); |
40 | | /// ``` |
41 | | #[derive(Debug, Clone, PartialEq, Default)] |
42 | | pub struct FixedInteger(FixedDecimal); |
43 | | |
44 | | impl From<FixedInteger> for FixedDecimal { |
45 | 0 | fn from(value: FixedInteger) -> Self { |
46 | 0 | value.0 |
47 | 0 | } |
48 | | } |
49 | | |
50 | | macro_rules! impl_fixed_integer_from_integer_type { |
51 | | ($type:ident) => { |
52 | | impl From<$type> for FixedInteger { |
53 | 0 | fn from(value: $type) -> Self { |
54 | 0 | FixedInteger(FixedDecimal::from(value)) |
55 | 0 | } Unexecuted instantiation: <fixed_decimal::integer::FixedInteger as core::convert::From<isize>>::from Unexecuted instantiation: <fixed_decimal::integer::FixedInteger as core::convert::From<i128>>::from Unexecuted instantiation: <fixed_decimal::integer::FixedInteger as core::convert::From<i64>>::from Unexecuted instantiation: <fixed_decimal::integer::FixedInteger as core::convert::From<i32>>::from Unexecuted instantiation: <fixed_decimal::integer::FixedInteger as core::convert::From<i16>>::from Unexecuted instantiation: <fixed_decimal::integer::FixedInteger as core::convert::From<i8>>::from Unexecuted instantiation: <fixed_decimal::integer::FixedInteger as core::convert::From<usize>>::from Unexecuted instantiation: <fixed_decimal::integer::FixedInteger as core::convert::From<u128>>::from Unexecuted instantiation: <fixed_decimal::integer::FixedInteger as core::convert::From<u64>>::from Unexecuted instantiation: <fixed_decimal::integer::FixedInteger as core::convert::From<u32>>::from Unexecuted instantiation: <fixed_decimal::integer::FixedInteger as core::convert::From<u16>>::from Unexecuted instantiation: <fixed_decimal::integer::FixedInteger as core::convert::From<u8>>::from |
56 | | } |
57 | | }; |
58 | | } |
59 | | |
60 | | impl_fixed_integer_from_integer_type!(isize); |
61 | | impl_fixed_integer_from_integer_type!(i128); |
62 | | impl_fixed_integer_from_integer_type!(i64); |
63 | | impl_fixed_integer_from_integer_type!(i32); |
64 | | impl_fixed_integer_from_integer_type!(i16); |
65 | | impl_fixed_integer_from_integer_type!(i8); |
66 | | impl_fixed_integer_from_integer_type!(usize); |
67 | | impl_fixed_integer_from_integer_type!(u128); |
68 | | impl_fixed_integer_from_integer_type!(u64); |
69 | | impl_fixed_integer_from_integer_type!(u32); |
70 | | impl_fixed_integer_from_integer_type!(u16); |
71 | | impl_fixed_integer_from_integer_type!(u8); |
72 | | |
73 | | impl writeable::Writeable for FixedInteger { |
74 | 0 | fn write_to<W: fmt::Write + ?Sized>(&self, sink: &mut W) -> fmt::Result { |
75 | 0 | self.0.write_to(sink) |
76 | 0 | } |
77 | | } |
78 | | |
79 | | impl TryFrom<FixedDecimal> for FixedInteger { |
80 | | type Error = Error; |
81 | 0 | fn try_from(value: FixedDecimal) -> Result<Self, Error> { |
82 | 0 | if value.magnitude_range().start() != &0 { |
83 | 0 | Err(Error::Limit) |
84 | | } else { |
85 | 0 | Ok(FixedInteger(value)) |
86 | | } |
87 | 0 | } |
88 | | } |
89 | | |
90 | | impl TryFrom<&[u8]> for FixedInteger { |
91 | | type Error = Error; |
92 | 0 | fn try_from(value: &[u8]) -> Result<Self, Error> { |
93 | 0 | FixedInteger::try_from(FixedDecimal::try_from(value)?) |
94 | 0 | } |
95 | | } |
96 | | |
97 | | impl FromStr for FixedInteger { |
98 | | type Err = Error; |
99 | 0 | fn from_str(value: &str) -> Result<Self, Self::Err> { |
100 | 0 | FixedInteger::try_from(FixedDecimal::from_str(value)?) |
101 | 0 | } |
102 | | } |