A very simple Stopwatch for the command line
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

55 lines
1.5 KiB

5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
  1. //! stopwatch is a simple CLI stopwatch
  2. use crossbeam_channel::tick;
  3. use std::io::{stdout, Write};
  4. use std::time::Instant;
  5. use stopwatch::duration::FmtDuration;
  6. use stopwatch::*;
  7. #[macro_use]
  8. extern crate crossbeam_channel;
  9. fn main() {
  10. if let Err(err) = run() {
  11. println!("{}", err);
  12. std::process::exit(1);
  13. }
  14. }
  15. fn run() -> std::io::Result<()> {
  16. // 30 fps should be enough
  17. let step_duration = std::time::Duration::from_millis(1000 / 30);
  18. let start = Instant::now();
  19. let ticker = tick(step_duration);
  20. let signals = signal_handler()?;
  21. let input = input_handler()?;
  22. let out = stdout();
  23. let mut out = out.lock();
  24. let mut elapsed = FmtDuration::from(start.elapsed());
  25. let mut last_round = start.clone();
  26. let mut round: u32 = 1;
  27. loop {
  28. select! {
  29. recv(ticker) -> now => {
  30. elapsed = FmtDuration::from(now.unwrap().duration_since(start));
  31. reset_line(&mut out).unwrap();
  32. write!(out, "{}",elapsed).unwrap();
  33. out.flush().unwrap();
  34. }
  35. recv(signals) -> _ => {
  36. reset_line(&mut out).unwrap();
  37. writeln!(out, "Total time: {}", elapsed).unwrap();
  38. return Ok(());
  39. }
  40. recv(input) -> _ => {
  41. reset_line(&mut out)?;
  42. writeln!(out, "Lap {}: {}", round, FmtDuration::from(last_round.elapsed()))?;
  43. last_round = Instant::now();
  44. round +=1;
  45. }
  46. }
  47. }
  48. }