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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
use std::fmt;
use std::fmt::{Display, Formatter};
#[derive(Debug, PartialEq, Clone, Default)]
pub struct Body {
text: String,
}
impl Body {
#[must_use]
pub fn append(&self, additional: &Body) -> Body {
Body::from(format!("{}\n{}", self.text, additional.text))
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.text.is_empty()
}
}
impl From<&str> for Body {
fn from(body: &str) -> Self {
Body {
text: String::from(body),
}
}
}
impl From<String> for Body {
fn from(body: String) -> Self {
Body { text: body }
}
}
impl From<Body> for String {
fn from(body: Body) -> Self {
body.text
}
}
impl Display for Body {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
write!(f, "{}", String::from(self.clone()))
}
}
#[cfg(test)]
mod tests {
use super::Body;
use indoc::indoc;
use pretty_assertions::assert_eq;
#[test]
fn it_can_give_me_it_as_a_string_from_a_str() {
let body = Body::from("Example Body");
assert_eq!(String::from(body), String::from("Example Body"))
}
#[test]
fn it_can_give_me_it_as_a_string_from_a_string() {
let body = Body::from(String::from("Example Body"));
assert_eq!(String::from(body), String::from("Example Body"))
}
#[test]
fn it_implements_display() {
let body = Body::from("Example Body");
assert_eq!(format!("{}", body), "Example Body")
}
#[test]
fn it_can_append_another_body_fragment() {
assert_eq!(
Body::from(indoc!(
"
Example 1
Example 2"
)),
Body::from("Example 1").append(&Body::from("Example 2"))
)
}
#[test]
fn it_can_tell_me_if_it_is_empty() {
assert_eq!(Body::from("").is_empty(), true)
}
#[test]
fn it_can_tell_me_if_it_is_full() {
assert_eq!(Body::from("something").is_empty(), false)
}
}