repl_rs/
value.rs

1use crate::Result;
2use std::fmt;
3
4/// Value type. Has conversions to every primitive type.
5#[derive(Clone, Debug)]
6pub struct Value {
7    value: String,
8}
9
10impl fmt::Display for Value {
11    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
12        write!(f, "{}", self.value)
13    }
14}
15
16/// Trait to convert from a [Value](struct.Value.html) to some other type.
17pub trait Convert<T> {
18    fn convert(&self) -> Result<T>;
19}
20
21impl Value {
22    pub(crate) fn new(value: &str) -> Self {
23        Self {
24            value: value.to_string(),
25        }
26    }
27}
28
29impl Convert<String> for Value {
30    fn convert(&self) -> Result<String> {
31        Ok(self.value.to_string())
32    }
33}
34
35macro_rules! add_num_converter {
36    ($type: ident) => {
37        impl Convert<$type> for Value {
38            fn convert(&self) -> Result<$type> {
39                Ok(self.value.parse::<$type>()?)
40            }
41        }
42    };
43}
44
45add_num_converter!(i8);
46add_num_converter!(i16);
47add_num_converter!(i32);
48add_num_converter!(i64);
49add_num_converter!(i128);
50add_num_converter!(isize);
51add_num_converter!(u8);
52add_num_converter!(u16);
53add_num_converter!(u32);
54add_num_converter!(u64);
55add_num_converter!(u128);
56add_num_converter!(usize);
57add_num_converter!(f32);
58add_num_converter!(f64);
59add_num_converter!(bool);