1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
use crate::ContentInfo;
use crate::Showable;
use anyhow::Error;
pub fn from_iter<T>(v: impl Iterator<Item = T>) -> ContentInfo
where
T: std::fmt::Debug,
{
let mut html = String::new();
html.push_str("<table>");
html.push_str("<tr>");
html.push_str("<th></th><th>0</th>");
html.push_str("<tr>");
for (r, row) in v.enumerate() {
html.push_str("<tr>");
html.push_str(&format!("<th>{}</th><td>{:?}</td>", r, row));
html.push_str("</tr>");
}
html.push_str("</table>");
ContentInfo {
mime_type: "text/html".into(),
content: html,
}
}
impl<T> Showable for Vec<T>
where
T: std::fmt::Debug,
{
fn to_content_info(&self) -> Result<ContentInfo, Error> {
Ok(from_iter(self.iter()))
}
}
impl<T> Showable for &[T]
where
T: std::fmt::Debug,
{
fn to_content_info(&self) -> Result<ContentInfo, Error> {
Ok(from_iter(self.iter()))
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_vec() {
let m = vec![1.0, 2.0, 3.0];
m.show().unwrap();
}
#[test]
fn test_slice() {
let m0 = vec![1.0, 2.0, 3.0];
let m = m0.as_slice();
m.show().unwrap();
}
}