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