nextest_runner/show_config/
nextest_version.rs

1// Copyright (c) The nextest Contributors
2// SPDX-License-Identifier: MIT OR Apache-2.0
3
4use crate::config::{NextestVersionConfig, NextestVersionEval, NextestVersionReq};
5use owo_colors::{OwoColorize, Style};
6use semver::Version;
7use std::io::{self, Write};
8
9/// Show version-related configuration.
10pub struct ShowNextestVersion<'a> {
11    version_cfg: &'a NextestVersionConfig,
12    current_version: &'a Version,
13    override_version_check: bool,
14}
15
16impl<'a> ShowNextestVersion<'a> {
17    /// Construct a new [`ShowNextestVersion`].
18    pub fn new(
19        version_cfg: &'a NextestVersionConfig,
20        current_version: &'a Version,
21        override_version_check: bool,
22    ) -> Self {
23        Self {
24            version_cfg,
25            current_version,
26            override_version_check,
27        }
28    }
29
30    /// Write the version configuration in human-readable form.
31    pub fn write_human(&self, writer: &mut dyn Write, colorize: bool) -> io::Result<()> {
32        let mut styles = Styles::default();
33        if colorize {
34            styles.colorize();
35        }
36
37        writeln!(
38            writer,
39            "current nextest version: {}",
40            self.current_version.style(styles.version)
41        )?;
42
43        write!(writer, "version requirements:")?;
44
45        let mut any_requirements = false;
46        if let NextestVersionReq::Version { version, tool } = &self.version_cfg.required {
47            if !any_requirements {
48                writeln!(writer)?;
49            }
50            any_requirements = true;
51            write!(writer, "    - required: {}", version.style(styles.version))?;
52            if let Some(tool) = tool {
53                writeln!(writer, " (by tool {})", tool.style(styles.tool))?;
54            } else {
55                writeln!(writer)?;
56            }
57        }
58
59        if let NextestVersionReq::Version { version, tool } = &self.version_cfg.recommended {
60            if !any_requirements {
61                writeln!(writer)?;
62            }
63            any_requirements = true;
64            write!(
65                writer,
66                "    - recommended: {}",
67                version.style(styles.version)
68            )?;
69            if let Some(tool) = tool {
70                writeln!(writer, " (by tool {})", tool.style(styles.tool))?;
71            } else {
72                writeln!(writer)?;
73            }
74        }
75
76        if any_requirements {
77            write!(writer, "evaluation result: ")?;
78            let eval = self
79                .version_cfg
80                .eval(self.current_version, self.override_version_check);
81            match eval {
82                NextestVersionEval::Satisfied => {
83                    writeln!(writer, "{}", "ok".style(styles.satisfied))?;
84                }
85                NextestVersionEval::Error { .. } => {
86                    writeln!(
87                        writer,
88                        "{}",
89                        "does not meet required version".style(styles.error)
90                    )?;
91                }
92                NextestVersionEval::Warn { .. } => {
93                    writeln!(
94                        writer,
95                        "{}",
96                        "does not meet recommended version".style(styles.warning)
97                    )?;
98                }
99                NextestVersionEval::ErrorOverride { .. } => {
100                    writeln!(
101                        writer,
102                        "does not meet required version, but is {}",
103                        "overridden".style(styles.overridden),
104                    )?;
105                }
106                crate::config::NextestVersionEval::WarnOverride { .. } => {
107                    writeln!(
108                        writer,
109                        "does not meet recommended version, but is {}",
110                        "overridden".style(styles.overridden),
111                    )?;
112                }
113            }
114        } else {
115            writeln!(writer, " (none)")?;
116        }
117
118        Ok(())
119    }
120}
121
122#[derive(Clone, Debug, Default)]
123struct Styles {
124    version: Style,
125    tool: Style,
126    satisfied: Style,
127    error: Style,
128    warning: Style,
129    overridden: Style,
130}
131
132impl Styles {
133    fn colorize(&mut self) {
134        self.version = Style::new().bold();
135        self.tool = Style::new().bold().yellow();
136        self.satisfied = Style::new().bold().green();
137        self.error = Style::new().bold().red();
138        self.warning = Style::new().bold().yellow();
139        self.overridden = Style::new().bold();
140    }
141}