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 crate::AverInt {
22    fn aver_display(&self) -> String {
23        // `AverInt`'s `Display` renders the bare decimal (Small or Big),
24        // byte-identical to the VM's `Value::Int` display.
25        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}