1pub mod prelude;
5
6#[derive(Debug, Clone, PartialEq)]
8pub enum ConversionError {
9 Error(String, String),
10}
11impl ConversionError {
12 pub(crate) fn error<F: Into<String>, M: Into<String>>(from: F, msg: M) -> Self {
13 return Self::Error(from.into(), msg.into());
14 }
15}
16pub trait GoToU8 {fn goto_u8(&self) -> u8;}
20pub trait GoToU16 {fn goto_u16(&self) -> u16;}
21pub trait GoToU32 {fn goto_u32(&self) -> u32;}
22pub trait GoToU64 {fn goto_u64(&self) -> u64;}
23pub trait GoToU128 {fn goto_u128(&self) -> u128;}
24pub trait GoToUsize {fn goto_usize(&self) -> usize;}
25pub trait GoToF32 {fn goto_f32(&self) -> f32;}
26pub trait GoToF64 {fn goto_f64(&self) -> f64;}
27pub trait TryGoToU8 {fn try_goto_u8(&self) -> Result<u8, ConversionError>;}
28pub trait TryGoToU16 {fn try_goto_u16(&self) -> Result<u16, ConversionError>;}
29pub trait TryGoToU32 {fn try_goto_u32(&self) -> Result<u32, ConversionError>;}
30pub trait TryGoToU64 {fn try_goto_u64(&self) -> Result<u64, ConversionError>;}
31pub trait TryGoToU128 {fn try_goto_u128(&self) -> Result<u128, ConversionError>;}
32pub trait TryGoToUsize {fn try_goto_usize(&self) -> Result<usize, ConversionError>;}
33pub trait TryGoToF32 {fn try_goto_f32(&self) -> Result<f32, ConversionError>;}
34pub trait TryGoToF64 {fn try_goto_f64(&self) -> Result<f64, ConversionError>;}
35impl GoToU8 for u8 {fn goto_u8(&self) -> u8 {*self as u8}}
39impl GoToU16 for u8 {fn goto_u16(&self) -> u16 {*self as u16}}
40impl GoToU32 for u8 {fn goto_u32(&self) -> u32 {*self as u32}}
41impl GoToU64 for u8 {fn goto_u64(&self) -> u64 {*self as u64}}
42impl GoToU128 for u8 {fn goto_u128(&self) -> u128 {*self as u128}}
43impl GoToUsize for u8 {fn goto_usize(&self) -> usize {*self as usize}}
44impl GoToF32 for u8 {fn goto_f32(&self) -> f32 {*self as f32}}
45impl GoToF64 for u8 {fn goto_f64(&self) -> f64 {*self as f64}}
46impl TryGoToU8 for u16 {
50 fn try_goto_u8(&self) -> Result<u8, ConversionError> {
51 if *self <= u8::MAX as u16 {Ok(*self as u8)}
52 else {Err(ConversionError::error("better-conversions::TryGoToU8::try_goto_u8", format!("{} out of u8 range", self)))}
53 }
54}
55impl GoToU16 for u16 {fn goto_u16(&self) -> u16 {*self as u16}}
56impl GoToU32 for u16 {fn goto_u32(&self) -> u32 {*self as u32}}
57impl GoToU64 for u16 {fn goto_u64(&self) -> u64 {*self as u64}}
58impl GoToU128 for u16 {fn goto_u128(&self) -> u128 {*self as u128}}
59impl GoToUsize for u16 {fn goto_usize(&self) -> usize {*self as usize}}
60impl GoToF32 for u16 {fn goto_f32(&self) -> f32 {*self as f32}}
61impl GoToF64 for u16 {fn goto_f64(&self) -> f64 {*self as f64}}
62impl TryGoToU8 for u32 {
66 fn try_goto_u8(&self) -> Result<u8, ConversionError> {
67 if *self <= u8::MAX as u32 {Ok(*self as u8)}
68 else {Err(ConversionError::error("better-conversions::TryGoToU8::try_goto_u8", format!("{} out of u8 range", self)))}
69 }
70}
71impl TryGoToU16 for u32 {
72 fn try_goto_u16(&self) -> Result<u16, ConversionError> {
73 if *self <= u16::MAX as u32 {Ok(*self as u16)}
74 else {Err(ConversionError::error("better-conversions::TryGoToU16::try_goto_u16", format!("{} out of u16 range", self)))}
75 }
76}
77impl GoToU32 for u32 {fn goto_u32(&self) -> u32 {*self as u32}}
78impl GoToU64 for u32 {fn goto_u64(&self) -> u64 {*self as u64}}
79impl GoToU128 for u32 {fn goto_u128(&self) -> u128 {*self as u128}}
80impl GoToUsize for u32 {fn goto_usize(&self) -> usize {*self as usize}}
81impl TryGoToF32 for u32 {
82 fn try_goto_f32(&self) -> Result<f32, ConversionError> {
83 let converted = *self as f32;
84 if converted as u32 == *self {Ok(converted)}
85 else {Err(ConversionError::error("better-conversions::TryGoToF32::try_goto_f32", format!("{} lost precision as a f32", self)))}
86 }
87}
88impl GoToF64 for u32 {fn goto_f64(&self) -> f64 {*self as f64}}
89impl TryGoToU8 for u64 {
93 fn try_goto_u8(&self) -> Result<u8, ConversionError> {
94 if *self <= u8::MAX as u64 {Ok(*self as u8)}
95 else {Err(ConversionError::error("better-conversions::TryGoToU8::try_goto_u8", format!("{} out of u8 range", self)))}
96 }
97}
98impl TryGoToU16 for u64 {
99 fn try_goto_u16(&self) -> Result<u16, ConversionError> {
100 if *self <= u16::MAX as u64 {Ok(*self as u16)}
101 else {Err(ConversionError::error("better-conversions::TryGoToU16::try_goto_u16", format!("{} out of u16 range", self)))}
102 }
103}
104impl TryGoToU32 for u64 {
105 fn try_goto_u32(&self) -> Result<u32, ConversionError> {
106 if *self <= u32::MAX as u64 {Ok(*self as u32)}
107 else {Err(ConversionError::error("better-conversions::TryGoToU32::try_goto_u32", format!("{} out of u32 range", self)))}
108 }
109}
110impl GoToU64 for u64 {fn goto_u64(&self) -> u64 {*self as u64}}
111impl GoToU128 for u64 {fn goto_u128(&self) -> u128 {*self as u128}}
112impl TryGoToUsize for u64 {
113 fn try_goto_usize(&self) -> Result<usize, ConversionError> {
114 if *self <= usize::MAX as u64 {Ok(*self as usize)}
115 else {Err(ConversionError::error("better-conversions::TryGoToUsize::try_goto_usize", format!("{} out of usize range", self)))}
116 }
117}
118impl TryGoToF32 for u64 {
119 fn try_goto_f32(&self) -> Result<f32, ConversionError> {
120 let converted = *self as f32;
121 if converted as u64 == *self {Ok(converted)}
122 else {Err(ConversionError::error("better-conversions::TryGoToF32::try_goto_f32", format!("{} lost precision as a f32", self)))}
123 }
124}
125impl TryGoToF64 for u64 {
126 fn try_goto_f64(&self) -> Result<f64, ConversionError> {
127 let converted = *self as f64;
128 if converted as u64 == *self {Ok(converted)}
129 else {Err(ConversionError::error("better-conversions::TryGoToF64::try_goto_f64", format!("{} lost precision as a f64", self)))}
130 }
131}
132impl TryGoToU8 for u128 {
136 fn try_goto_u8(&self) -> Result<u8, ConversionError> {
137 if *self <= u8::MAX as u128 {Ok(*self as u8)}
138 else {Err(ConversionError::error("better-conversions::TryGoToU8::try_goto_u8", format!("{} out of u8 range", self)))}
139 }
140}
141impl TryGoToU16 for u128 {
142 fn try_goto_u16(&self) -> Result<u16, ConversionError> {
143 if *self <= u16::MAX as u128 {Ok(*self as u16)}
144 else {Err(ConversionError::error("better-conversions::TryGoToU16::try_goto_u16", format!("{} out of u16 range", self)))}
145 }
146}
147impl TryGoToU32 for u128 {
148 fn try_goto_u32(&self) -> Result<u32, ConversionError> {
149 if *self <= u32::MAX as u128 {Ok(*self as u32)}
150 else {Err(ConversionError::error("better-conversions::TryGoToU32::try_goto_u32", format!("{} out of u32 range", self)))}
151 }
152}
153impl TryGoToU64 for u128 {
154 fn try_goto_u64(&self) -> Result<u64, ConversionError> {
155 if *self <= u64::MAX as u128 {Ok(*self as u64)}
156 else {Err(ConversionError::error("better-conversions::TryGoToU64::try_goto_u64", format!("{} out of u64 range", self)))}
157 }
158}
159impl GoToU128 for u128 {fn goto_u128(&self) -> u128 {*self as u128}}
160impl TryGoToUsize for u128 {
161 fn try_goto_usize(&self) -> Result<usize, ConversionError> {
162 if *self <= usize::MAX as u128 {Ok(*self as usize)}
163 else {Err(ConversionError::error("better-conversions::TryGoToUsize::try_goto_usize", format!("{} out of usize range", self)))}
164 }
165}
166impl TryGoToF32 for u128 {
167 fn try_goto_f32(&self) -> Result<f32, ConversionError> {
168 let converted = *self as f32;
169 if converted as u128 == *self {Ok(converted)}
170 else {Err(ConversionError::error("better-conversions::TryGoToF32::try_goto_f32", format!("{} lost precision as a f32", self)))}
171 }
172}
173impl TryGoToF64 for u128 {
174 fn try_goto_f64(&self) -> Result<f64, ConversionError> {
175 let converted = *self as f64;
176 if converted as u128 == *self {Ok(converted)}
177 else {Err(ConversionError::error("better-conversions::TryGoToF64::try_goto_f64", format!("{} lost precision as a f64", self)))}
178 }
179}
180impl TryGoToU8 for usize {
184 fn try_goto_u8(&self) -> Result<u8, ConversionError> {
185 if *self <= u8::MAX as usize { Ok(*self as u8) }
186 else { Err(ConversionError::error("better-conversions::TryGoToU8::try_goto_u8", format!("{} out of u8 range", self))) }
187 }
188}
189impl TryGoToU16 for usize {
190 fn try_goto_u16(&self) -> Result<u16, ConversionError> {
191 if *self <= u16::MAX as usize { Ok(*self as u16) }
192 else { Err(ConversionError::error("better-conversions::TryGoToU16::try_goto_u16", format!("{} out of u16 range", self))) }
193 }
194}
195impl TryGoToU32 for usize {
196 fn try_goto_u32(&self) -> Result<u32, ConversionError> {
197 if *self <= u32::MAX as usize { Ok(*self as u32) }
198 else { Err(ConversionError::error("better-conversions::TryGoToU32::try_goto_u32", format!("{} out of u32 range", self))) }
199 }
200}
201impl TryGoToU64 for usize {
202 fn try_goto_u64(&self) -> Result<u64, ConversionError> {
203 if *self <= u64::MAX as usize { Ok(*self as u64) }
204 else { Err(ConversionError::error("better-conversions::TryGoToU64::try_goto_u64", format!("{} out of u64 range", self))) }
205 }
206}
207impl GoToU128 for usize { fn goto_u128(&self) -> u128 { *self as u128 } }
208impl GoToUsize for usize { fn goto_usize(&self) -> usize { *self } }
209impl TryGoToF32 for usize {
210 fn try_goto_f32(&self) -> Result<f32, ConversionError> {
211 let converted = *self as f32;
212 if converted as usize == *self { Ok(converted) }
213 else { Err(ConversionError::error("better-conversions::TryGoToF32::try_goto_f32", format!("{} lost precision as a f32", self))) }
214 }
215}
216impl TryGoToF64 for usize {
217 fn try_goto_f64(&self) -> Result<f64, ConversionError> {
218 let converted = *self as f64;
219 if converted as usize == *self { Ok(converted) }
220 else { Err(ConversionError::error("better-conversions::TryGoToF64::try_goto_f64", format!("{} lost precision as a f64", self))) }
221 }
222}
223impl TryGoToU8 for f32 {
227 fn try_goto_u8(&self) -> Result<u8, ConversionError> {
228 if !self.is_finite() {return Err(ConversionError::error("better-conversions::TryGoToU8::try_goto_u8", format!("{} is not finite", self)));}
229 if self.fract() != 0.0 {return Err(ConversionError::error("better-conversions::TryGoToU8::try_goto_u8", format!("{} has a fractional", self)));}
230 if *self >= 0.0 && *self <= u8::MAX as f32 {Ok(*self as u8)}
231 else {Err(ConversionError::error("better-conversions::TryGoToU8::try_goto_u8", format!("{} out of u8 range", self)))}
232 }
233}
234impl TryGoToU16 for f32 {
235 fn try_goto_u16(&self) -> Result<u16, ConversionError> {
236 if !self.is_finite() {return Err(ConversionError::error("better-conversions::TryGoToU16::try_goto_u16", format!("{} is not finite", self)));}
237 if self.fract() != 0.0 {return Err(ConversionError::error("better-conversions::TryGoToU16::try_goto_u16", format!("{} has a fractional", self)));}
238 if *self >= 0.0 && *self <= u16::MAX as f32 {Ok(*self as u16)}
239 else {Err(ConversionError::error("better-conversions::TryGoToU16::try_goto_u16", format!("{} out of u16 range", self)))}
240 }
241}
242impl TryGoToU32 for f32 {
243 fn try_goto_u32(&self) -> Result<u32, ConversionError> {
244 if !self.is_finite() {return Err(ConversionError::error("better-conversions::TryGoToU32::try_goto_u32", format!("{} is not finite", self)));}
245 if self.fract() != 0.0 {return Err(ConversionError::error("better-conversions::TryGoToU32::try_goto_u32", format!("{} has a fractional", self)));}
246 if *self >= 0.0 && *self <= u32::MAX as f32 {Ok(*self as u32)}
247 else {Err(ConversionError::error("better-conversions::TryGoToU32::try_goto_u32", format!("{} out of u32 range", self)))}
248 }
249}
250impl TryGoToU64 for f32 {
251 fn try_goto_u64(&self) -> Result<u64, ConversionError> {
252 if !self.is_finite() {return Err(ConversionError::error("better-conversions::TryGoToU64::try_goto_u64", format!("{} is not finite", self)));}
253 if self.fract() != 0.0 {return Err(ConversionError::error("better-conversions::TryGoToU64::try_goto_u64", format!("{} has a fractional", self)));}
254 if *self >= 0.0 && *self <= u64::MAX as f32 {Ok(*self as u64)}
255 else {Err(ConversionError::error("better-conversions::TryGoToU64::try_goto_u64", format!("{} out of u64 range", self)))}
256 }
257}
258impl TryGoToU128 for f32 {
259 fn try_goto_u128(&self) -> Result<u128, ConversionError> {
260 if !self.is_finite() {return Err(ConversionError::error("better-conversions::TryGoToU128::try_goto_u128", format!("{} is not finite", self)));}
261 if self.fract() != 0.0 {return Err(ConversionError::error("better-conversions::TryGoToU128::try_goto_u128", format!("{} has a fractional", self)));}
262 if *self >= 0.0 && *self <= u128::MAX as f32 {Ok(*self as u128)}
263 else {Err(ConversionError::error("better-conversions::TryGoToU128::try_goto_u128", format!("{} out of u128 range", self)))}
264 }
265}
266impl TryGoToUsize for f32 {
267 fn try_goto_usize(&self) -> Result<usize, ConversionError> {
268 if !self.is_finite() {return Err(ConversionError::error("better-conversions::TryGoToUsize::try_goto_usize", format!("{} is not finite", self)));}
269 if self.fract() != 0.0 {return Err(ConversionError::error("better-conversions::TryGoToUsize::try_goto_usize", format!("{} has a fractional", self)));
270 }
271 if *self >= 0.0 && *self <= usize::MAX as f32 {Ok(*self as usize)}
272 else {Err(ConversionError::error("better-conversions::TryGoToUsize::try_goto_usize", format!("{} out of usize range", self)))}
273 }
274}
275impl GoToF32 for f32 {fn goto_f32(&self) -> f32 {*self as f32}}
276impl GoToF64 for f32 {fn goto_f64(&self) -> f64 {*self as f64}}
277impl TryGoToU8 for f64 {
281 fn try_goto_u8(&self) -> Result<u8, ConversionError> {
282 if !self.is_finite() {return Err(ConversionError::error("better-conversions::TryGoToU8::try_goto_u8", format!("{} is not finite", self)));}
283 if self.fract() != 0.0 {return Err(ConversionError::error("better-conversions::TryGoToU8::try_goto_u8", format!("{} has a fractional", self)));}
284 if *self >= 0.0 && *self <= u8::MAX as f64 {Ok(*self as u8)}
285 else {Err(ConversionError::error("better-conversions::TryGoToU8::try_goto_u8", format!("{} out of u8 range", self)))}
286 }
287}
288impl TryGoToU16 for f64 {
289 fn try_goto_u16(&self) -> Result<u16, ConversionError> {
290 if !self.is_finite() {return Err(ConversionError::error("better-conversions::TryGoToU16::try_goto_u16", format!("{} is not finite", self)));}
291 if self.fract() != 0.0 {return Err(ConversionError::error("better-conversions::TryGoToU16::try_goto_u16", format!("{} has a fractional", self)));}
292 if *self >= 0.0 && *self <= u16::MAX as f64 {Ok(*self as u16)}
293 else {Err(ConversionError::error("better-conversions::TryGoToU16::try_goto_u16", format!("{} out of u16 range", self)))}
294 }
295}
296impl TryGoToU32 for f64 {
297 fn try_goto_u32(&self) -> Result<u32, ConversionError> {
298 if !self.is_finite() {return Err(ConversionError::error("better-conversions::TryGoToU32::try_goto_u32", format!("{} is not finite", self)));}
299 if self.fract() != 0.0 {return Err(ConversionError::error("better-conversions::TryGoToU32::try_goto_u32", format!("{} has a fractional", self)));}
300 if *self >= 0.0 && *self <= u32::MAX as f64 {Ok(*self as u32)}
301 else {Err(ConversionError::error("better-conversions::TryGoToU32::try_goto_u32", format!("{} out of u32 range", self)))}
302 }
303}
304impl TryGoToU64 for f64 {
305 fn try_goto_u64(&self) -> Result<u64, ConversionError> {
306 if !self.is_finite() {return Err(ConversionError::error("better-conversions::TryGoToU64::try_goto_u64", format!("{} is not finite", self)));}
307 if self.fract() != 0.0 {return Err(ConversionError::error("better-conversions::TryGoToU64::try_goto_u64", format!("{} has a fractional", self)));}
308 if *self >= 0.0 && *self <= u64::MAX as f64 {Ok(*self as u64)}
309 else {Err(ConversionError::error("better-conversions::TryGoToU64::try_goto_u64", format!("{} out of u64 range", self)))}
310 }
311}
312impl TryGoToU128 for f64 {
313 fn try_goto_u128(&self) -> Result<u128, ConversionError> {
314 if !self.is_finite() {return Err(ConversionError::error("better-conversions::TryGoToU128::try_goto_u128", format!("{} is not finite", self)));}
315 if self.fract() != 0.0 {return Err(ConversionError::error("better-conversions::TryGoToU128::try_goto_u128", format!("{} has a fractional", self)));}
316 if *self >= 0.0 && *self <= u128::MAX as f64 {Ok(*self as u128)}
317 else {Err(ConversionError::error("better-conversions::TryGoToU128::try_goto_u128", format!("{} out of u128 range", self)))}
318 }
319}
320impl TryGoToUsize for f64 {
321 fn try_goto_usize(&self) -> Result<usize, ConversionError> {
322 if !self.is_finite() {return Err(ConversionError::error("better-conversions::TryGoToUsize::try_goto_usize", format!("{} is not finite", self)));}
323 if self.fract() != 0.0 {return Err(ConversionError::error("better-conversions::TryGoToUsize::try_goto_usize", format!("{} has a fractional", self)));}
324 if *self >= 0.0 && *self <= usize::MAX as f64 {Ok(*self as usize)}
325 else {Err(ConversionError::error("better-conversions::TryGoToUsize::try_goto_usize", format!("{} out of usize range", self)))}
326 }
327}
328impl TryGoToF32 for f64 {
329 fn try_goto_f32(&self) -> Result<f32, ConversionError> {
330 if !self.is_finite() {return Err(ConversionError::error("better-conversions::TryGoToF32::try_goto_f32", format!("{} is not finite", self)));}
331 if *self >= f32::MIN as f64 && *self <= f32::MAX as f64 {Ok(*self as f32)}
332 else {Err(ConversionError::error("better-conversions::TryGoToF32::try_goto_f32", format!("{} out of f32 range", self)))}
333 }
334}
335impl GoToF64 for f64 {fn goto_f64(&self) -> f64 {*self as f64}}
336