Crates.io | ogle |
lib.rs | ogle |
version | 2.2.1 |
created_at | 2020-10-03 16:12:11.308528+00 |
updated_at | 2025-08-31 12:28:26.396667+00 |
description | Execute a command periodically, showing the output only when it changes |
homepage | https://github.com/lpenz/ogle |
repository | https://github.com/lpenz/ogle |
max_upload_size | |
id | 295815 |
size | 129,177 |
<O>
ogleogle 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:
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.
ogle also supports limited interactive control with one-character commands followed by ENTER:
q
: quit after when the process is no longer running.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.
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:
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.user_wrapper
: abstract user interaction. At the moment, we
just monitor stdin
in line mode, and ogle exits gracefully
when that's detected.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 -> engine -> view -> output