Skip to main content

cbor_core/value/
int.rs

1use super::*;
2
3// --------- From ints ---------
4
5impl From<u8> for Value {
6    fn from(value: u8) -> Self {
7        Self::Unsigned(value.into())
8    }
9}
10
11impl From<u16> for Value {
12    fn from(value: u16) -> Self {
13        Self::Unsigned(value.into())
14    }
15}
16
17impl From<u32> for Value {
18    fn from(value: u32) -> Self {
19        Self::Unsigned(value.into())
20    }
21}
22
23impl From<u64> for Value {
24    fn from(value: u64) -> Self {
25        Self::Unsigned(value)
26    }
27}
28
29impl From<u128> for Value {
30    fn from(value: u128) -> Self {
31        if value <= u64::MAX as u128 {
32            Self::Unsigned(value as u64)
33        } else {
34            let bytes: Vec<u8> = value.to_be_bytes().into_iter().skip_while(|&byte| byte == 0).collect();
35            debug_assert!(bytes.len() > 8);
36            Self::tag(Tag::POS_BIG_INT, bytes)
37        }
38    }
39}
40
41#[cfg(any(target_pointer_width = "32", target_pointer_width = "64"))]
42impl From<usize> for Value {
43    fn from(value: usize) -> Self {
44        Self::Unsigned(value as u64)
45    }
46}
47
48impl From<i8> for Value {
49    fn from(value: i8) -> Self {
50        if value >= 0 {
51            Self::Unsigned(value as u64)
52        } else {
53            Self::Negative((!value) as u64)
54        }
55    }
56}
57
58impl From<i16> for Value {
59    fn from(value: i16) -> Self {
60        if value >= 0 {
61            Self::Unsigned(value as u64)
62        } else {
63            Self::Negative((!value) as u64)
64        }
65    }
66}
67
68impl From<i32> for Value {
69    fn from(value: i32) -> Self {
70        if value >= 0 {
71            Self::Unsigned(value as u64)
72        } else {
73            Self::Negative((!value) as u64)
74        }
75    }
76}
77
78impl From<i64> for Value {
79    fn from(value: i64) -> Self {
80        if value >= 0 {
81            Self::Unsigned(value as u64)
82        } else {
83            Self::Negative((!value) as u64)
84        }
85    }
86}
87
88impl From<i128> for Value {
89    fn from(value: i128) -> Self {
90        if value >= 0 {
91            Self::from(value as u128)
92        } else {
93            let complement = (!value) as u128;
94
95            if complement <= u64::MAX as u128 {
96                Self::Negative(complement as u64)
97            } else {
98                let bytes: Vec<u8> = complement
99                    .to_be_bytes()
100                    .into_iter()
101                    .skip_while(|&byte| byte == 0)
102                    .collect();
103                debug_assert!(bytes.len() > 8);
104                Self::tag(Tag::NEG_BIG_INT, bytes)
105            }
106        }
107    }
108}
109
110#[cfg(any(target_pointer_width = "32", target_pointer_width = "64"))]
111impl From<isize> for Value {
112    fn from(value: isize) -> Self {
113        Self::from(value as i64)
114    }
115}
116
117// --------- TryFrom Value ---------
118
119impl TryFrom<Value> for u8 {
120    type Error = Error;
121    fn try_from(value: Value) -> Result<Self> {
122        value.to_u8()
123    }
124}
125
126impl TryFrom<Value> for u16 {
127    type Error = Error;
128    fn try_from(value: Value) -> Result<Self> {
129        value.to_u16()
130    }
131}
132
133impl TryFrom<Value> for u32 {
134    type Error = Error;
135    fn try_from(value: Value) -> Result<Self> {
136        value.to_u32()
137    }
138}
139
140impl TryFrom<Value> for u64 {
141    type Error = Error;
142    fn try_from(value: Value) -> Result<Self> {
143        value.to_u64()
144    }
145}
146
147impl TryFrom<Value> for u128 {
148    type Error = Error;
149    fn try_from(value: Value) -> Result<Self> {
150        value.to_u128()
151    }
152}
153
154impl TryFrom<Value> for usize {
155    type Error = Error;
156    fn try_from(value: Value) -> Result<Self> {
157        value.to_usize()
158    }
159}
160
161impl TryFrom<Value> for i8 {
162    type Error = Error;
163    fn try_from(value: Value) -> Result<Self> {
164        value.to_i8()
165    }
166}
167
168impl TryFrom<Value> for i16 {
169    type Error = Error;
170    fn try_from(value: Value) -> Result<Self> {
171        value.to_i16()
172    }
173}
174
175impl TryFrom<Value> for i32 {
176    type Error = Error;
177    fn try_from(value: Value) -> Result<Self> {
178        value.to_i32()
179    }
180}
181
182impl TryFrom<Value> for i64 {
183    type Error = Error;
184    fn try_from(value: Value) -> Result<Self> {
185        value.to_i64()
186    }
187}
188
189impl TryFrom<Value> for i128 {
190    type Error = Error;
191    fn try_from(value: Value) -> Result<Self> {
192        value.to_i128()
193    }
194}
195
196impl TryFrom<Value> for isize {
197    type Error = Error;
198    fn try_from(value: Value) -> Result<Self> {
199        value.to_isize()
200    }
201}