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.

48 lines
1003 B

5 years ago
5 years ago
  1. use crossbeam_channel::{bounded, Receiver};
  2. use duration::*;
  3. use signal_hook::iterator::Signals;
  4. use signal_hook::SIGINT;
  5. use std::io::{stdin, Result, StdoutLock, Write};
  6. use std::thread;
  7. pub mod duration;
  8. pub fn signal_handler() -> Result<Receiver<()>> {
  9. let (s, r) = bounded(1);
  10. let signals = Signals::new(&[SIGINT])?;
  11. thread::spawn(move || {
  12. for _ in signals.forever() {
  13. if s.send(()).is_err() {
  14. break;
  15. }
  16. }
  17. });
  18. Ok(r)
  19. }
  20. pub fn input_handler() -> Result<Receiver<()>> {
  21. let (s, r) = bounded(1);
  22. let mut buf = String::new();
  23. thread::spawn(move || loop {
  24. if stdin().read_line(&mut buf).is_err() {
  25. break;
  26. }
  27. if s.send(()).is_err() {
  28. break;
  29. }
  30. });
  31. Ok(r)
  32. }
  33. /// Resets the current line on stdout
  34. ///
  35. /// # Arguments
  36. ///
  37. /// * w - A reference to the locked stdout handle
  38. pub fn reset_line(w: &mut StdoutLock) -> Result<()> {
  39. write!(w, "\r[2K")
  40. }