Support progress bars
- [ ] Render and update a progress bar for humans
- will probably need to return something non-
()fromOutput::print
- will probably need to return something non-
- [ ] Render other stuff above it while progress bar is visible
- [ ] Render usable stuff to JSON (e.g. a 'tick' with current state each n seconds)
Termcolor doesn't support advanced Windows stuff. We might be able to use some of what console does, though.
Some notes from talking with @waywardmonkeys:
- Output "records" can have different types
- additive
- replacing
- Replacing works by supplying the UUID of the record to replace
- introduce records that have UUIDs
- track them in the output to be able to replace them
- not all output media will be able to do replacements, e.g. json streams
- Maybe the replacement mechanism is part of the layout (cf. #3), e.g. in a layout with "additive on top", "replaceable progressbar sticky at the bottom"
This will require some more refactoring and design work before I'm happy with the API. Currently, my idea was to have something like
output.progress(convey::Progress::bar(i, 10).message(msg));
which would always replace the current progress bar. (Something like convey::Progress::none() would remove it.)
I think we should go one step further, though, and also help with managing the state of the progress bar in between calls. Maybe even have an iterator adapter to quickly update the progress bar in an iterator chain.
My experiments so far have been just that, experiments. I'll try to write more of this down in the future, and come up with more test cases to evaluate a design against.