1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
use std::convert::TryFrom; use std::fmt::{self, Display, Formatter}; #[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd)] pub enum Value<'b> { Int(u32), Str(&'b str), } impl<'b> Value<'b> { #[inline] pub fn into_bool(self) -> bool { self.into() } } impl<'b> Display for Value<'b> { #[inline] fn fmt(&self, formatter: &mut Formatter) -> fmt::Result { match self { Value::Int(num) => num.fmt(formatter), Value::Str(str) => formatter.write_str(str), } } } impl<'b> From<bool> for Value<'b> { #[inline] fn from(b: bool) -> Self { if b { Value::Int(1) } else { Value::Int(0) } } } impl<'b> From<Value<'b>> for bool { #[inline] fn from(v: Value) -> Self { match v { Value::Int(0) | Value::Str("") => false, _ => true, } } } impl<'b> From<u32> for Value<'b> { #[inline] fn from(n: u32) -> Self { Value::Int(n) } } impl<'b> From<&'b str> for Value<'b> { #[inline] fn from(s: &'b str) -> Self { Value::Str(s) } } impl<'b> From<&'b mut str> for Value<'b> { #[inline] fn from(s: &'b mut str) -> Self { Value::Str(s) } } #[derive(Debug)] pub struct ValueConvertError; impl<'b> TryFrom<Value<'b>> for u32 { type Error = ValueConvertError; #[inline] fn try_from(v: Value<'b>) -> Result<Self, Self::Error> { match v { Value::Int(n) => Ok(n), _ => Err(ValueConvertError), } } } impl<'b> TryFrom<Value<'b>> for usize { type Error = ValueConvertError; #[inline] fn try_from(v: Value<'b>) -> Result<Self, Self::Error> { match v { Value::Int(n) => Ok(n as usize), _ => Err(ValueConvertError), } } } impl<'b> TryFrom<Value<'b>> for &'b str { type Error = ValueConvertError; #[inline] fn try_from(v: Value<'b>) -> Result<Self, Self::Error> { match v { Value::Str(s) => Ok(s), _ => Err(ValueConvertError), } } }