prodash allows to integrate progress reporting into concurrent applications and provides renderers for displaying it in various ways.
It's easy to integrate thanks to a pragmatic API, and comes with a terminal user interface by default.
Be sure to read the documentation at https://docs.rs/prodash, it contains various examples on how to get started.
Or run the demo application like so cd prodash && cargo run --all-features --example dashboard.
This crate comes with various cargo features to tailor it to your needs.
Progress and Root trait implementation for use with the render-line and render-tui backed by dashmap.log crate is initialized, a log will be used to output all messages provided to
tree::Item::message(…) and friends. No actual progress is written.render-tui or render-line, or any renderer outputting to the console.Progress implementation which logs messages and progress using the log craterender-tui will be using the local time, not UTCrender-line will be using the local time, not UTCrender-tui or render-line respectivelyrender::line::Options::auto_configure() will configure the display based on whether or not we are in a terminal
and set its color mode based on what's possible or desired.hide_cursor line renderer option is set, the cursor will be hidden and SIG_INT and SIG_TERM handlers will be
installed to reset the cursor on exit. Otherwise you have to make sure to call shutdown_and_wait() on the JoinHandle returned
to give the renderer a chance to undo the terminal changes. Failing to do so will leave the cusor hidden once the program has already
finished.crossterm crate as terminal backendcargo build --features render-tui-crossterm,crossterm/event-streamtermion crate as terminal backendunix systemsrender-tui and render-tui-termion.bytesize crate.human_format crate.jiff crate's friendly duration format.dashmap, does not document every use of unsafeevmap, which has 25% less uses of unsafe, but a more complex interface.drop() is not garantueed to be called when the future returns Ready and is in the futures::executor::ThreadPoolfutures::future::abortable() works (by stopping the polling), but doesn't as cleanup is not performed,
even though it clearly would be preferred.select() might not work with complex futures - these should then be boxed() if Unpin isn't implemented.$ claude mcp add prodash \
-- python -m otcore.mcp_server <graph>