zero_days/
lib.rs

1const ZERO: &str =
2    "    ____\u{20}
3   / __ \\
4  / / / /
5 / /_/ /\u{20}
6\\____/  ";
7
8fn wrap(s: &str) -> String {
9    let mut out = String::new();
10    let mut word = String::new();
11    let mut len = 0;
12
13    for c in s.chars() {
14        if c.is_whitespace() {
15            len += word.len() + 1;
16            out.extend(word.drain(..));
17            out.push(c);
18        } else {
19            word.push(c);
20        }
21
22        if len > 70 {
23            out.push('\n');
24            len = 0;
25        }
26    }
27
28    out.extend(word.chars());
29
30    out
31}
32
33fn center_lines(s: &str) -> String {
34    s.lines().map(|l| format!("|{:^78}|", l)).collect::<Vec<_>>().join("\n")
35}
36
37pub fn draw(s: &str) -> String {
38    format!(
39        r#"
40+------------------------------------------------------------------------------+
41|                                                                              |
42|{:^78}|
43|                                                                              |
44{}
45|                                                                              |
46|{:^78}|
47|                                                                              |
48{}
49|                                                                              |
50+------------------------------------------------------------------------------+
51"#,
52        "It has been",
53        center_lines(ZERO),
54        "days",
55        center_lines(&wrap(&format!("since {}", s)))
56    )
57}