From 5c4224b8b032f696c2ec4b81b4984fab269c5325 Mon Sep 17 00:00:00 2001 From: Marcel Schneider Date: Wed, 13 Feb 2019 18:56:21 +0100 Subject: [PATCH] Add laps --- src/duration.rs | 2 +- src/lib.rs | 18 +++++++++++++++++- src/main.rs | 26 ++++++++++++++++++-------- 3 files changed, 36 insertions(+), 10 deletions(-) diff --git a/src/duration.rs b/src/duration.rs index db14f7e..e4a613c 100644 --- a/src/duration.rs +++ b/src/duration.rs @@ -1,7 +1,7 @@ use std::convert::From; use std::{fmt, time}; -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct FmtDuration(time::Duration); impl fmt::Display for FmtDuration { diff --git a/src/lib.rs b/src/lib.rs index cee9906..9121916 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,7 +2,7 @@ use crossbeam_channel::{bounded, Receiver}; use duration::*; use signal_hook::iterator::Signals; use signal_hook::SIGINT; -use std::io::{Result, StdoutLock, Write}; +use std::io::{stdin, Result, StdoutLock, Write}; use std::thread; pub mod duration; @@ -22,6 +22,22 @@ pub fn signal_handler() -> Result> { Ok(r) } +pub fn input_handler() -> Result> { + let (s, r) = bounded(1); + let mut buf = String::new(); + + thread::spawn(move || loop { + if stdin().read_line(&mut buf).is_err() { + break; + } + if s.send(()).is_err() { + break; + } + }); + + Ok(r) +} + /// Resets the current line on stdout /// /// # Arguments diff --git a/src/main.rs b/src/main.rs index 69a8f92..d88bc03 100644 --- a/src/main.rs +++ b/src/main.rs @@ -10,22 +10,26 @@ use stopwatch::*; extern crate crossbeam_channel; fn main() { + if let Err(err) = run() { + println!("{}", err); + std::process::exit(1); + } +} + +fn run() -> std::io::Result<()> { // 30 fps should be enough let step_duration = std::time::Duration::from_millis(1000 / 30); let start = Instant::now(); let ticker = tick(step_duration); - let signals = match signal_handler() { - Ok(r) => r, - Err(err) => { - println!("{}", err); - return; - } - }; + let signals = signal_handler()?; + let input = input_handler()?; let out = stdout(); let mut out = out.lock(); let mut elapsed = FmtDuration::from(start.elapsed()); + let mut last_round = start.clone(); + let mut round: u32 = 1; loop { select! { @@ -38,7 +42,13 @@ fn main() { recv(signals) -> _ => { reset_line(&mut out).unwrap(); writeln!(out, "Total time: {}", elapsed).unwrap(); - return; + return Ok(()); + } + recv(input) -> _ => { + reset_line(&mut out)?; + writeln!(out, "Lap {}: {}", round, FmtDuration::from(last_round.elapsed()))?; + last_round = Instant::now(); + round +=1; } } }