1use crate::Result;
2use std::fmt;
3
4#[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
16pub 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);