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}