console_static_text
Crate for logging text that should stay in the same place in a console. This measures words to handle wrapping and has some console resizing support. Example use might be for displaying progress bars or rendering selections.
Example use with the console crate:
use console_static_text::ConsoleSize;
use console_static_text::ConsoleStaticText;
let mut static_text = ConsoleStaticText::new(|| {
let size = console::Term::stderr().size();
ConsoleSize {
rows: Some(size.0),
cols: Some(size.1),
}
});
static_text.eprint("initial\ntext");
std::thread::sleep_ms(1000);
// will clear the previous text and put this new text
static_text.eprint("new text");
std::thread::sleep_ms(1000);
// or get and output the text manually
if let Some(text) = static_text.render("new text") {
eprint!("{}", text);
std::thread::sleep_ms(1000);
}
// clear out the previous text
static_text.eprint_clear();
Hanging indentation
To get hanging indentation, you can use the lower level "items" api.
static_text.eprint_items(vec![
TextItem::Text(Cow::Borrowed("Some non-hanging text.")),
TextItem::HangingText {
text: Cow::Borrowed("some long text that will wrap at a certain width"),
indent: 4,
},
].iter());
This is useful when implementing something like a selection UI where you want text to wrap with hanging indentation.
"sized" feature
By default, this crate encourages you to use your own functionality for getting the console size since you'll likely already have a dependency that does that, but if not, then you can use the sized
Cargo.toml feature.
[dependencies]
console_static_text = { version = "...", features = ["sized"] }
Then you can use the new_sized
function, which will get the console size automatically:
let mut static_text = ConsoleStaticText::new_sized();
static_text.eprint("initial\ntext");
std::thread::sleep_ms(1000);
static_text.eprint("next text");