ml-progress
Progress indicator for terminal/console.
- single line
- no ANSI escape codes, just
\r - background thread for timely updates
- opinionated syntax
Early version - this hasn't yet been tested properly.
Usage
- Either
- create
Progresswithprogress!macro (if you don't need custom configuration) or - create
ProgressBuilderwithprogress_builder!macro, set custom options, and then createProgresswithbuild.
- create
- During prosessing update state with
incandmessage. - Finish using one of
finish,finish_and_clearorfinish_at_current_pos.
Examples
Default items
use progress;
let progress = progress!?;
for _ in 0..10
progress.finish;
# Ok::
##############################-------------------- 6/10 (2s)
Custom items
use progress;
let progress = progress!?;
for _ in 0..10
progress.finish;
# Ok::
[ 60%] 6/10 ########################----------------- (0:02)
Custom configuration
use progress_builder;
let progress = progress_builder!
.total
.thousands_separator
.build?;
for _ in 0..10
progress.finish;
# Ok::
[ 60%] 6,000/10,000 ###################-------------- (0:02)
Items
Items are used with progress! and progress_builder! macros.
- Each item is either a single token (e.g.
bar_fill) or multiple tokens surrounded by parentheses (e.g.(eta "{:2}{:1}")). - Items are given without separators in between, except whitespace.
- At most one
*_fillitem is allowed.
Summary
Summary of all possible items. See below for further details.
"foo" // "foo"
bar_fill // "######----"
eta // "5m" ; same as (eta "{}{}")
(eta FORMAT NONE) // u64, &str
eta_hms // "5:23"
message_fill // "foo"
percent // " 23%" ; same as (percent "{:3.0}%")
(percent FORMAT NONE) // f64
pos // "1234567" ; same as (pos "{}" )
pos_group // "1 234 567" ; same as (pos "{:#}" )
pos_bin // "1.18 Mi" ; same as (pos_bin "{:#} {}")
pos_dec // "1.23 M" ; same as (pos_dec "{:#} {}")
(pos FORMAT) // u64
(pos_bin FORMAT) // f64, prefix
(pos_dec FORMAT) // f64, prefix
speed // "1234567" ; same as (speed "{:#}" )
speed_int // "1234567" ; same as (speed_int "{}" )
speed_group // "1 234 567" ; same as (speed_int "{:#}" )
speed_bin // "1.18 Mi" ; same as (speed_bin "{:#} {}")
speed_dec // "1.23 M" ; same as (speed_dec "{:#} {}")
(speed FORMAT NONE) // f64
(speed_int FORMAT NONE) // u64
(speed_bin FORMAT NONE) // f64, prefix
(speed_dec FORMAT NONE) // f64, prefix
total // "1234567" ; same as (total "{}" )
total_group // "1 234 567" ; same as (total "{:#}" )
total_bin // "1.18 Mi" ; same as (total_bin "{:#} {}")
total_dec // "1.23 M" ; same as (total_dec "{:#} {}")
(total FORMAT NONE) // u64
(total_bin FORMAT NONE) // f64, prefix
(total_dec FORMAT NONE) // f64, prefix
(|state| EXPR)
FORMAT
- Normal Rust format string with special handling of
#"alternate" flag (see below).
NONE
- Literal value to be shown when value in question is
None.- See corresponding functions of
Stateabout when values areNone.
- See corresponding functions of
- This is optional and can be left out. Default value is empty string.
Prefixes
- Items ending with
_binuse 1024-based binary prefixes (Ki,Mi,Gi, ...). - Items ending with
_decuse 1000-based decimal prefixes (k,M,G, ...).
If value is below 1024 or 1000 then prefix is empty string.
Alternate format
When # "alternate" flag is used in FORMAT,
following applies based on type:
u64is formatted with digits in groups of three.- Thousands separator can be set with
ProgressBuilder::thousands_separator, default is space. - e.g.
1234567with"{:#}"is shown as"1 234 567"with default separator
- Thousands separator can be set with
f64- Format
precision(default: 4) is considered "fit width" and value is shown with maximum number of decimals so that it fits this width, or with no decimals if fit is not possible. - With
pos_bin,pos_dec,total_binandtotal_dec: Amounts with empty prefix are shown with no decimals. - Examples
1.2345with"{:#}"is shown as"1.23"12.345with"{:#}"is shown as"12.3"123.45with"{:#}"is shown as"123"1234.5with"{:#}"is shown as"1235"12345with"{:#}"is shown as"12345"
- Format
prefix"{:#}"shows empty prefix as-is and other prefixes with prepended space.
Literal
"foo" // "foo"
Shows given literal string.
bar_fill
bar_fill // "######----"
Shows progress bar which fills remaining space on the line.
- Spaces are shown instead if
totalisNone.
eta
eta // "5m" ; same as (eta "{}{}")
(eta FORMAT) // u64, &str
(eta FORMAT NONE)
Shows estimated time remaining in approximate format: amount and unit,
or NONE if estimate is not available.
- Amount is the number of full units, i.e. it's not rounded.
- Unit can be
h(hours),m(minutes) ors(seconds)
eta_hms
eta_hms // "12:34:56" "0:56"
Shows estimated time remaining as hours/minutes/seconds, or empty string if estimate is not available.
- Depending on magnitude format is one of H:MM:SS, MM:SS or M:SS.
- Value is the number of full seconds, i.e. it's not rounded.
message_fill
message_fill // "foo"
Shows the message set with Progress::message,
filling the remaining space on the line.
percent
percent // " 23%" ; same as (percent "{:3.0}%")
(percent FORMAT) // f64
(percent FORMAT NONE)
Shows percentual completion or NONE if total is None.
pos
pos // "1234567" ; same as (pos "{}" )
pos_group // "1 234 567" ; same as (pos "{:#}" )
pos_bin // "1.18 Mi" ; same as (pos_bin "{:#} {}")
pos_dec // "1.23 M" ; same as (pos_dec "{:#} {}")
(pos FORMAT) // u64
(pos_bin FORMAT) // f64, prefix
(pos_dec FORMAT) // f64, prefix
Shows position.
pos- as integerpos_group- as integer, with digits in groups of threepos_bin- as floating-point amount with binary prefixpos_dec- as floating-point amount with decimal prefix
speed
speed // "1234567" ; same as (speed "{:#}" )
speed_int // "1234567" ; same as (speed_int "{}" )
speed_group // "1 234 567" ; same as (speed_int "{:#}" )
speed_bin // "1.18 Mi" ; same as (speed_bin "{:#} {}")
speed_dec // "1.23 M" ; same as (speed_dec "{:#} {}")
(speed FORMAT) // f64
(speed FORMAT NONE)
(speed_int FORMAT) // u64
(speed_int FORMAT NONE)
(speed_bin FORMAT) // f64, prefix
(speed_bin FORMAT NONE)
(speed_dec FORMAT) // f64, prefix
(speed_dec FORMAT NONE)
Shows speed as steps per second or NONE if speed is not available.
speed- as floating-pointspeed_int- as integerspeed_group- as integer, with digits in groups of threespeed_bin- as floating-point amount with binary prefixspeed_dec- as floating-point amount with decimal prefix
total
total // "1234567" ; same as (total "{}" )
total_group // "1 234 567" ; same as (total "{:#}" )
total_bin // "1.18 Mi" ; same as (total_bin "{:#} {}")
total_dec // "1.23 M" ; same as (total_dec "{:#} {}")
(total FORMAT) // u64
(total FORMAT NONE)
(total_bin FORMAT) // f64, prefix
(total_bin FORMAT NONE)
(total_dec FORMAT) // f64, prefix
(total_dec FORMAT NONE)
Shows total or NONE if total is None.
total- as integertotal_group- as integer, with digits in groups of threetotal_bin- as floating-point amount with binary prefixtotal_dec- as floating-point amount with decimal prefix
Custom item
(|state| EXPR)
Shows return value of given function
which takes State as input and returns String.
(|s| custom_eta(s)) // "12h 34m 56s"
use ml_progress::State;
fn custom_eta(state: &State) -> String {
if let Some(eta) = state.eta() {
let (h, m, s) = ml_progress::duration_hms(eta);
if h > 0 {
format!("{}h {}m {}s", h, m, s)
} else if m > 0 {
format!("{}m {}s", m, s)
} else {
format!("{}s", s)
}
} else {
"".to_string()
}
}