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