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 crate::AverStr {
38    fn aver_display(&self) -> String {
39        self.to_string()
40    }
41
42    fn aver_display_inner(&self) -> String {
43        format!("\"{}\"", self)
44    }
45}
46
47impl AverDisplay for bool {
48    fn aver_display(&self) -> String {
49        if *self {
50            "true".to_string()
51        } else {
52            "false".to_string()
53        }
54    }
55}
56
57impl AverDisplay for () {
58    fn aver_display(&self) -> String {
59        "()".to_string()
60    }
61}
62
63impl<T: AverDisplay, E: AverDisplay> AverDisplay for Result<T, E> {
64    fn aver_display(&self) -> String {
65        match self {
66            Ok(v) => format!("Result.Ok({})", v.aver_display_inner()),
67            Err(e) => format!("Result.Err({})", e.aver_display_inner()),
68        }
69    }
70
71    fn aver_display_inner(&self) -> String {
72        self.aver_display()
73    }
74}
75
76impl<T: AverDisplay> AverDisplay for Option<T> {
77    fn aver_display(&self) -> String {
78        match self {
79            Some(v) => format!("Option.Some({})", v.aver_display_inner()),
80            None => "Option.None".to_string(),
81        }
82    }
83
84    fn aver_display_inner(&self) -> String {
85        self.aver_display()
86    }
87}
88
89impl<T: AverDisplay> AverDisplay for Box<T> {
90    fn aver_display(&self) -> String {
91        (**self).aver_display()
92    }
93
94    fn aver_display_inner(&self) -> String {
95        (**self).aver_display_inner()
96    }
97}
98
99impl<T: AverDisplay> AverDisplay for Vec<T> {
100    fn aver_display(&self) -> String {
101        let parts: Vec<String> = self.iter().map(|x| x.aver_display_inner()).collect();
102        format!("[{}]", parts.join(", "))
103    }
104
105    fn aver_display_inner(&self) -> String {
106        self.aver_display()
107    }
108}
109
110impl<T: AverDisplay> AverDisplay for AverList<T> {
111    fn aver_display(&self) -> String {
112        let parts: Vec<String> = self.iter().map(|x| x.aver_display_inner()).collect();
113        format!("[{}]", parts.join(", "))
114    }
115
116    fn aver_display_inner(&self) -> String {
117        self.aver_display()
118    }
119}
120
121impl<K: AverDisplay + Eq + std::hash::Hash + Ord, V: AverDisplay> AverDisplay
122    for std::collections::HashMap<K, V>
123{
124    fn aver_display(&self) -> String {
125        let mut keys: Vec<&K> = self.keys().collect();
126        keys.sort();
127        let parts: Vec<String> = keys
128            .iter()
129            .map(|k| {
130                format!(
131                    "{}: {}",
132                    k.aver_display_inner(),
133                    self[*k].aver_display_inner()
134                )
135            })
136            .collect();
137        format!("{{{}}}", parts.join(", "))
138    }
139
140    fn aver_display_inner(&self) -> String {
141        self.aver_display()
142    }
143}
144
145impl<K: AverDisplay + Clone + Eq + std::hash::Hash + Ord, V: AverDisplay + Clone> AverDisplay
146    for crate::AverMap<K, V>
147{
148    fn aver_display(&self) -> String {
149        let mut keys: Vec<&K> = self.keys().collect();
150        keys.sort();
151        let parts: Vec<String> = keys
152            .iter()
153            .map(|k| {
154                format!(
155                    "{}: {}",
156                    k.aver_display_inner(),
157                    self[k].aver_display_inner()
158                )
159            })
160            .collect();
161        format!("{{{}}}", parts.join(", "))
162    }
163
164    fn aver_display_inner(&self) -> String {
165        self.aver_display()
166    }
167}
168
169impl<T: AverDisplay + Clone> AverDisplay for crate::AverVector<T> {
170    fn aver_display(&self) -> String {
171        let parts: Vec<String> = self.iter().map(|v| v.aver_display_inner()).collect();
172        format!("Vector[{}]", parts.join(", "))
173    }
174
175    fn aver_display_inner(&self) -> String {
176        self.aver_display()
177    }
178}
179
180impl<A: AverDisplay, B: AverDisplay> AverDisplay for (A, B) {
181    fn aver_display(&self) -> String {
182        format!(
183            "({}, {})",
184            self.0.aver_display_inner(),
185            self.1.aver_display_inner()
186        )
187    }
188
189    fn aver_display_inner(&self) -> String {
190        self.aver_display()
191    }
192}
193
194impl<A: AverDisplay, B: AverDisplay, C: AverDisplay> AverDisplay for (A, B, C) {
195    fn aver_display(&self) -> String {
196        format!(
197            "({}, {}, {})",
198            self.0.aver_display_inner(),
199            self.1.aver_display_inner(),
200            self.2.aver_display_inner()
201        )
202    }
203
204    fn aver_display_inner(&self) -> String {
205        self.aver_display()
206    }
207}