Skip to content

Commit

Permalink
Merge pull request de-vri-es#28 from TheFurnace/issue/27/proposal
Browse files Browse the repository at this point in the history
Collect output to buffer then print to stdErr once
  • Loading branch information
de-vri-es authored Jan 22, 2023
2 parents c3a9867 + 8dba936 commit 24687d9
Showing 1 changed file with 37 additions and 33 deletions.
70 changes: 37 additions & 33 deletions src/__assert2_impl/print.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use atty::Stream;
use std::fmt::Debug;
use yansi::Paint;
use std::fmt::Write;

fn should_color() -> bool {
if std::env::var_os("CLICOLOR").map(|x| x == "0").unwrap_or(false) {
Expand Down Expand Up @@ -31,8 +32,8 @@ pub struct FailedCheck<'a, T> {
}

pub trait CheckExpression {
fn print_expression(&self);
fn print_expansion(&self);
fn print_expression(&self, print_message: &mut String);
fn print_expansion(&self, print_message: &mut String);
}

pub struct BinaryOp<'a, Left, Right> {
Expand All @@ -58,77 +59,80 @@ impl<'a, T: CheckExpression> FailedCheck<'a, T> {
#[rustfmt::skip]
pub fn print(&self) {
set_color();
eprintln!("{msg} at {file}:{line}:{column}:",
let mut print_message = String::new();
writeln!(&mut print_message, "{msg} at {file}:{line}:{column}:",
msg = Paint::red("Assertion failed").bold(),
file = Paint::default(self.file).bold(),
line = self.line,
column = self.column,
);
eprint!(" {name}{open} ",
).unwrap();
write!(&mut print_message, " {name}{open} ",
name = Paint::magenta(self.macro_name),
open = Paint::magenta("!("),
);
self.expression.print_expression();
eprintln!(" {}", Paint::magenta(")"));
).unwrap();
self.expression.print_expression(&mut print_message);
writeln!(&mut print_message, " {}", Paint::magenta(")")).unwrap();
if !self.fragments.is_empty() {
eprintln!("with:");
writeln!(&mut print_message, "with:").unwrap();
for (name, expansion) in self.fragments {
eprintln!(" {} {} {}", Paint::magenta(name), Paint::blue("=").bold(), expansion);
writeln!(&mut print_message, " {} {} {}", Paint::magenta(name), Paint::blue("=").bold(), expansion).unwrap();
}
}
eprintln!("with expansion:");
eprint!(" ");
self.expression.print_expansion();
eprintln!();
writeln!(&mut print_message, "with expansion:").unwrap();
write!(&mut print_message, " ").unwrap();
self.expression.print_expansion(&mut print_message);
writeln!(&mut print_message, ).unwrap();
if let Some(msg) = self.custom_msg {
eprintln!("with message:");
eprintln!(" {}", Paint::default(msg).bold());
writeln!(&mut print_message, "with message:").unwrap();
writeln!(&mut print_message, " {}", Paint::default(msg).bold()).unwrap();
}
eprintln!();
writeln!(&mut print_message).unwrap();

eprint!("{}", print_message);
}
}

#[rustfmt::skip]
impl<Left: Debug, Right: Debug> CheckExpression for BinaryOp<'_, Left, Right> {
fn print_expression(&self) {
eprint!("{left} {op} {right}",
fn print_expression(&self, print_message: &mut String) {
write!(print_message, "{left} {op} {right}",
left = Paint::cyan(self.left_expr),
op = Paint::blue(self.operator).bold(),
right = Paint::yellow(self.right_expr),
);
).unwrap();
}
fn print_expansion(&self) {
eprint!("{left:?} {op} {right:?}",
fn print_expansion(&self, print_message: &mut String) {
write!(print_message, "{left:?} {op} {right:?}",
left = Paint::cyan(self.left),
op = Paint::blue(self.operator).bold(),
right = Paint::yellow(self.right),
);
).unwrap();
}
}

#[rustfmt::skip]
impl CheckExpression for BooleanExpr<'_> {
fn print_expression(&self) {
eprint!("{}", Paint::cyan(self.expression));
fn print_expression(&self, print_message: &mut String) {
write!(print_message, "{}", Paint::cyan(self.expression)).unwrap();
}
fn print_expansion(&self) {
eprint!("{:?}", Paint::cyan(false));
fn print_expansion(&self, print_message: &mut String) {
write!(print_message, "{:?}", Paint::cyan(false)).unwrap();
}
}

#[rustfmt::skip]
impl<Value: Debug> CheckExpression for MatchExpr<'_, Value> {
fn print_expression(&self) {
fn print_expression(&self, print_message: &mut String) {
if self.print_let {
eprint!("{} ", Paint::blue("let").bold());
write!(print_message, "{} ", Paint::blue("let").bold()).unwrap();
}
eprint!("{pat} {eq} {expr}",
write!(print_message, "{pat} {eq} {expr}",
pat = Paint::cyan(self.pattern),
eq = Paint::blue("=").bold(),
expr = Paint::yellow(self.expression),
);
).unwrap();
}
fn print_expansion(&self) {
eprint!("{:?}", Paint::yellow(self.value));
fn print_expansion(&self, print_message: &mut String) {
write!(print_message, "{:?}", Paint::yellow(self.value)).unwrap();
}
}

0 comments on commit 24687d9

Please sign in to comment.