From c5972fa2f86d2e884046b56a0c1869e84f9d393a Mon Sep 17 00:00:00 2001 From: Samuel Moelius Date: Mon, 3 Feb 2025 11:22:09 -0500 Subject: [PATCH] Add `TryFrom` for `SanitizedOutput` `SanitizedOutput`s have `String` `stdout` and `stderr` fields. This makes `SanitizedOutput`s easier to display than `Output`s. This commit adds a `TryFrom` implementation for `SanitizedOutput`. In this way, a test can run a command to produce an `Output`, and from that `Output` produce a `SanitizedOutput`. Extracted from #4175 --- src/test/mock/clitools.rs | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/test/mock/clitools.rs b/src/test/mock/clitools.rs index 80f2095126..b1152afad9 100644 --- a/src/test/mock/clitools.rs +++ b/src/test/mock/clitools.rs @@ -763,15 +763,12 @@ impl Config { self.run_subprocess(name, args.clone(), env) }; let duration = Instant::now() - start; - let output = SanitizedOutput { - ok: matches!(out.status, Some(0)), - stdout: String::from_utf8(out.stdout).unwrap(), - stderr: String::from_utf8(out.stderr).unwrap(), - }; + let status = out.status; + let output: SanitizedOutput = out.try_into().unwrap(); println!("ran: {} {:?}", name, args); println!("inprocess: {inprocess}"); - println!("status: {:?}", out.status); + println!("status: {:?}", status); println!("duration: {:.3}s", duration.as_secs_f32()); println!("stdout:\n====\n{}\n====\n", output.stdout); println!("stderr:\n====\n{}\n====\n", output.stderr); @@ -920,6 +917,18 @@ pub struct SanitizedOutput { pub stderr: String, } +impl TryFrom for SanitizedOutput { + type Error = std::string::FromUtf8Error; + fn try_from(out: Output) -> Result { + let sanitized_output = Self { + ok: matches!(out.status, Some(0)), + stdout: String::from_utf8(out.stdout)?, + stderr: String::from_utf8(out.stderr)?, + }; + Ok(sanitized_output) + } +} + pub fn cmd(config: &Config, name: &str, args: I) -> Command where I: IntoIterator,