bitbelay_report/section/test/module.rs
1//! Modules within a test section.
2
3use colored::Colorize as _;
4
5/// A module within a [`Test`](super::Test).
6#[derive(Clone, Debug, Eq, PartialEq)]
7pub struct Module {
8 /// The result.
9 result: Result,
10
11 /// The name.
12 name: String,
13
14 /// The value.
15 value: Option<String>,
16
17 /// Any details regarding the output.
18 details: Option<String>,
19}
20
21impl Module {
22 /// Creates a new [`Module`].
23 ///
24 /// # Examples
25 ///
26 /// ```
27 /// use bitbelay_report::section::test::module::Result;
28 /// use bitbelay_report::section::test::Module;
29 ///
30 /// let module = Module::new(Result::Inconclusive, "Baz", None, None);
31 /// assert_eq!(module.result(), &Result::Inconclusive);
32 /// assert_eq!(module.name(), "Baz");
33 /// assert_eq!(module.value(), None);
34 /// assert_eq!(module.details(), None);
35 /// ```
36 pub fn new(
37 result: Result,
38 name: impl Into<String>,
39 value: Option<String>,
40 details: Option<String>,
41 ) -> Self {
42 Self {
43 result,
44 name: name.into(),
45 value,
46 details,
47 }
48 }
49
50 /// Gets the result from a [`Module`].
51 ///
52 /// # Examples
53 ///
54 /// ```
55 /// use bitbelay_report::section::test::module::Result;
56 /// use bitbelay_report::section::test::Module;
57 ///
58 /// let module = Module::new(Result::Inconclusive, "Baz", None, None);
59 /// assert_eq!(module.result(), &Result::Inconclusive);
60 /// ```
61 pub fn result(&self) -> &Result {
62 &self.result
63 }
64
65 /// Gets the name from a [`Module`].
66 ///
67 /// # Examples
68 ///
69 /// ```
70 /// use bitbelay_report::section::test::module::Result;
71 /// use bitbelay_report::section::test::Module;
72 ///
73 /// let module = Module::new(Result::Inconclusive, "Baz", None, None);
74 /// assert_eq!(module.name(), "Baz");
75 /// ```
76 pub fn name(&self) -> &str {
77 self.name.as_ref()
78 }
79
80 /// Gets the value from a [`Module`] (if it exists).
81 ///
82 /// # Examples
83 ///
84 /// ```
85 /// use bitbelay_report::section::test::module::Result;
86 /// use bitbelay_report::section::test::Module;
87 ///
88 /// let module = Module::new(
89 /// Result::Inconclusive,
90 /// "Baz",
91 /// Some(String::from("Value")),
92 /// None,
93 /// );
94 /// assert_eq!(module.value(), Some("Value"));
95 /// ```
96 pub fn value(&self) -> Option<&str> {
97 self.value.as_deref()
98 }
99
100 /// Gets the details from a [`Module`] (if they exist).
101 ///
102 /// # Examples
103 ///
104 /// ```
105 /// use bitbelay_report::section::test::module::Result;
106 /// use bitbelay_report::section::test::Module;
107 ///
108 /// let module = Module::new(Result::Inconclusive, "Baz", None, None);
109 /// assert_eq!(module.details(), None);
110 ///
111 /// let module = Module::new(
112 /// Result::Inconclusive,
113 /// "Baz",
114 /// None,
115 /// Some(String::from("Foo and bar")),
116 /// );
117 /// assert_eq!(module.details(), Some("Foo and bar"));
118 /// ```
119 pub fn details(&self) -> Option<&str> {
120 self.details.as_deref()
121 }
122}
123
124/// A result of a module.
125#[derive(Clone, Debug, Eq, PartialEq)]
126pub enum Result {
127 /// A passed module.
128 Pass,
129
130 /// An inconclusive module.
131 Inconclusive,
132
133 /// A failed module.
134 Fail,
135}
136
137impl std::fmt::Display for Result {
138 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
139 if f.alternate() {
140 match self {
141 Result::Pass => write!(f, "{}", "✓".green().bold()),
142 Result::Inconclusive => write!(f, "{}", "?".yellow().bold()),
143 Result::Fail => write!(f, "{}", "X".red().bold()),
144 }
145 } else {
146 match self {
147 Result::Pass => write!(f, "✓"),
148 Result::Inconclusive => write!(f, "?"),
149 Result::Fail => write!(f, "X"),
150 }
151 }
152 }
153}