nextest_runner/show_config/
nextest_version.rs1use crate::config::{NextestVersionConfig, NextestVersionEval, NextestVersionReq};
5use owo_colors::{OwoColorize, Style};
6use semver::Version;
7use std::io::{self, Write};
8
9pub 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 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 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}