1use super::*;
2
3impl 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
117impl 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}