Skip to main content

aver_rt/
display.rs

1use crate::AverList;
2
3pub fn aver_display<T: AverDisplay>(val: &T) -> String {
4    val.aver_display()
5}
6
7pub trait AverDisplay {
8    fn aver_display(&self) -> String;
9
10    fn aver_display_inner(&self) -> String {
11        self.aver_display()
12    }
13}
14
15impl AverDisplay for i64 {
16    fn aver_display(&self) -> String {
17        self.to_string()
18    }
19}
20
21impl AverDisplay for f64 {
22    fn aver_display(&self) -> String {
23        self.to_string()
24    }
25}
26
27impl AverDisplay for String {
28    fn aver_display(&self) -> String {
29        self.clone()
30    }
31
32    fn aver_display_inner(&self) -> String {
33        format!("\"{}\"", self)
34    }
35}
36
37impl AverDisplay for bool {
38    fn aver_display(&self) -> String {
39        if *self {
40            "true".to_string()
41        } else {
42            "false".to_string()
43        }
44    }
45}
46
47impl AverDisplay for () {
48    fn aver_display(&self) -> String {
49        "()".to_string()
50    }
51}
52
53impl<T: AverDisplay, E: AverDisplay> AverDisplay for Result<T, E> {
54    fn aver_display(&self) -> String {
55        match self {
56            Ok(v) => format!("Result.Ok({})", v.aver_display_inner()),
57            Err(e) => format!("Result.Err({})", e.aver_display_inner()),
58        }
59    }
60
61    fn aver_display_inner(&self) -> String {
62        self.aver_display()
63    }
64}
65
66impl<T: AverDisplay> AverDisplay for Option<T> {
67    fn aver_display(&self) -> String {
68        match self {
69            Some(v) => format!("Option.Some({})", v.aver_display_inner()),
70            None => "Option.None".to_string(),
71        }
72    }
73
74    fn aver_display_inner(&self) -> String {
75        self.aver_display()
76    }
77}
78
79impl<T: AverDisplay> AverDisplay for Box<T> {
80    fn aver_display(&self) -> String {
81        (**self).aver_display()
82    }
83
84    fn aver_display_inner(&self) -> String {
85        (**self).aver_display_inner()
86    }
87}
88
89impl<T: AverDisplay> AverDisplay for Vec<T> {
90    fn aver_display(&self) -> String {
91        let parts: Vec<String> = self.iter().map(|x| x.aver_display_inner()).collect();
92        format!("[{}]", parts.join(", "))
93    }
94
95    fn aver_display_inner(&self) -> String {
96        self.aver_display()
97    }
98}
99
100impl<T: AverDisplay> AverDisplay for AverList<T> {
101    fn aver_display(&self) -> String {
102        let parts: Vec<String> = self.iter().map(|x| x.aver_display_inner()).collect();
103        format!("[{}]", parts.join(", "))
104    }
105
106    fn aver_display_inner(&self) -> String {
107        self.aver_display()
108    }
109}
110
111impl<K: AverDisplay + Eq + std::hash::Hash + Ord, V: AverDisplay> AverDisplay
112    for std::collections::HashMap<K, V>
113{
114    fn aver_display(&self) -> String {
115        let mut keys: Vec<&K> = self.keys().collect();
116        keys.sort();
117        let parts: Vec<String> = keys
118            .iter()
119            .map(|k| {
120                format!(
121                    "{}: {}",
122                    k.aver_display_inner(),
123                    self[*k].aver_display_inner()
124                )
125            })
126            .collect();
127        format!("{{{}}}", parts.join(", "))
128    }
129
130    fn aver_display_inner(&self) -> String {
131        self.aver_display()
132    }
133}
134
135impl<A: AverDisplay, B: AverDisplay> AverDisplay for (A, B) {
136    fn aver_display(&self) -> String {
137        format!(
138            "({}, {})",
139            self.0.aver_display_inner(),
140            self.1.aver_display_inner()
141        )
142    }
143
144    fn aver_display_inner(&self) -> String {
145        self.aver_display()
146    }
147}
148
149impl<A: AverDisplay, B: AverDisplay, C: AverDisplay> AverDisplay for (A, B, C) {
150    fn aver_display(&self) -> String {
151        format!(
152            "({}, {}, {})",
153            self.0.aver_display_inner(),
154            self.1.aver_display_inner(),
155            self.2.aver_display_inner()
156        )
157    }
158
159    fn aver_display_inner(&self) -> String {
160        self.aver_display()
161    }
162}