Crate ogle

Source
Expand description

ogle is a program that runs the given command-line periodically, showing the output only when it is different than the last.

The simplest way to show most of the features of ogle is by asking it to run date; sleep in a shell, with a waiting period of 3s:

demo

Lines that were written by ogle all start with =>. On the first execution, ogle shows a spinner while the command is running. On the next executions, ogle shows a progress bar, where the total corresponds to the duration of the previous execution. The sleep time is also shown, as a countdown. If the command returns an error to the shell, the error value is displayed.

§Installation

If you’re a Rust programmer, ogle can be installed with cargo:

$ cargo install ogle

If you’re a Debian user, ogle is available in packagecloud. Follow these instruction to use the package repository.

§Internals

To make it fully testable, it uses a layered architecture based on tokio streams which ends up being similar to how we use pipes in a shell. We can divide it in the following layers:

  • wrappers: we have 3 wrapper modules that abtract external libraries to provide us simpler types or types that provide that impl traits we need. They also make it easier to replate the underlying implementation in the future, if necessary. Namely:
    • [process_wrapper]: wraps process instantiation and I/O, and provides an Item that implements Eq so that we can use it in tests.
    • [term_wrapper]: implements terminal functions, mostly for output. As we are currently wrapping console and its functions require a console::Term object, we end up using a mutex here to abstract the singleton.
    • [time_wrapper]: home of the Instant and Duration types, which use types from chrono at the moment.
  • [sys]: most of the ogle code doesn’t really call functions that interact with the host system - we have the sys module for that. The module does that by providing a [sys::SysApi] trait that is then implemented by both the [sys::SysReal] type, which calls the system functions; and by the [sys::SysVirtual] type, which can be used to mock these calls in various ways.
sys -> input -> view -> output

Functions§

main
Ogle main function, the single pub function in this lib.