From d2c5ef1cfcffc6a54e4b669aae835051d262143d Mon Sep 17 00:00:00 2001 From: Scott Pierce Date: Sat, 17 Mar 2018 00:51:52 -0500 Subject: [PATCH] Step 5 - Nicely format stats output We implemant a `fmt::Display` trait to own the final representation of the Stats struct and add kilobytes processed. --- stream_stats.rs | 36 ++++++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/stream_stats.rs b/stream_stats.rs index 98cbc59..75a3aaa 100644 --- a/stream_stats.rs +++ b/stream_stats.rs @@ -1,12 +1,15 @@ +use std::fmt; use std::fs::{File, OpenOptions}; use std::io::{self, BufRead, BufReader, BufWriter, Write}; use std::time::Instant; static READ_BUF_SIZE: usize = 1024 * 1024; +static CLEAR_LINE: &str = "\x1B[1G\x1B[2K"; struct Stats { started: Instant, lines: usize, + bytes: usize, tty: File, } @@ -15,6 +18,7 @@ impl Stats { Stats { started: Instant::now(), lines: 0, + bytes: 0, tty: OpenOptions::new() .write(true) .append(true) @@ -24,6 +28,30 @@ impl Stats { } } +impl fmt::Display for Stats { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + + let elapsed = self.started.elapsed(); + let seconds: f64 = elapsed.as_secs() as f64 + elapsed.subsec_nanos() as f64 * 1e-9; + if seconds == 0.0 { + return write!(f, ""); + } + let kb = self.bytes as f64 / 1024 as f64; + let kb_per_sec = kb / seconds; + let lines_per_sec = self.lines as f64 / seconds; + write!( + f, + "{}{:.1} sec | {:.0} kb [ {:.1}/s ] | {} lines [ {:.0}/s ]", + CLEAR_LINE, + seconds, + kb, + kb_per_sec, + self.lines, + lines_per_sec + ) + } +} + fn main() { let mut reader = BufReader::with_capacity(READ_BUF_SIZE, io::stdin()); let mut writer = BufWriter::new(io::stdout()); @@ -33,13 +61,9 @@ fn main() { while reader.read_until(b'\n', &mut buffer).unwrap() > 0 { writer.write(&buffer).unwrap(); stats.lines += 1; + stats.bytes += &buffer.len(); buffer.clear(); } writer.flush().unwrap(); - writeln!( - stats.tty, - "lines: {}, {:?}", - stats.lines, - stats.started.elapsed() - ).expect("Could not write to tty!"); + writeln!(&stats.tty, "{}", &stats).expect("Could not write to tty!"); }