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