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}