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}