r3bl_tuify
- What does it do?
- How to use it as a library?
- How to use it as a binary?
- Build, run, test tasks
- References
What does it do?
This crate can be used in two ways:
- As a library. This is useful if you want to add simple interactivity to your CLI
app written in Rust. You can see an example of this in the
examplesfolder in themain_interactive.rsfile. You can run it usingcargo run --example main_interactive. - As a binary. This is useful if you want to use this crate as a command line tool.
The binary target is called
rt.
How to use it as a library?
Here's a demo of the library target of this crate in action.
The following example illustrates how you can use this as a library. The function that
does the work of rendering the UI is called
select_from_list. It takes a list of items, and returns
the selected item or items (depending on the selection mode). If the user does not
select anything, it returns None. The function also takes the maximum height and
width of the display, and the selection mode (single select or multiple select).
It works on macOS, Linux, and Windows. And is aware of terminal color output limitations of each. For eg, it uses Windows API on Windows for keyboard input. And on macOS Terminal.app it restricts color output to a 256 color palette.
Currently only single selection is implemented. An issue is open to add this feature: https://github.com/r3bl-org/r3bl_rs_utils/issues if you would like to contribute.
use *;
use *;
use Result;
How to use it as a binary?
Here's a demo of the binary target of this crate in action.
https://user-images.githubusercontent.com/2966499/266860855-dce05d87-327d-48f7-b063-45987177159c.mp4
You can install the binary using cargo install r3bl_tuify (from crates.io). Or
cargo install --path . from source. Once installed, you can rt is a command line
tool that allows you to select one of the options from the list that is passed into it
via stdin. It supports both stdin and stdout piping.
Here are the command line arguments that it accepts:
-sor--selection-mode- Allows you to select the selection mode. There are two options:singleandmultiple.-cor--command-to-run-with-selection- Allows you to specify the command to run with the selected item. For example"echo foo \'%\'"simply prints each selected item.-tor--tui-height- Optionally allows you to set the height of the TUI. The default is 5.
Currently only single selection is implemented. An issue is open to add this feature: https://github.com/r3bl-org/r3bl_rs_utils/issues if you would like to contribute.
Paths
There are a lot of different execution paths that you can take with this relatively simple program. Here is a list.
-
Happy paths:
rt- prints help.cat Cargo.toml | rt -s single -c "echo foo \'%\'"-stdinis piped in, and it prints the user selected option tostdout.cat Cargo.toml | rt -s multiple -c "echo foo \'%\'"-stdinis piped in, and it prints the user selected option tostdout.
-
Unhappy paths (
stdinis not piped in and, orstdoutis piped out):rt -s single- expectsstdinto be piped in, and prints help.rt -s multiple- expectsstdinto be piped in, and prints help.ls -la | rt -s single | xargs -0- does not expectstdoutto be piped out, and prints help.ls -la | rt -s multiple | xargs -0- does not expectstdoutto be piped out, and prints help.
Build, run, test tasks
Prerequisites
🌠In order for these to work you have to install the Rust toolchain and just and
cargo-watch:
- Install the Rust toolchain using
rustupby following the instructions here. - Install
cargo-watchusingcargo install cargo-watch. - Install
flamegraphusingcargo install flamegraph. - Install
justjuston your system usingcargo install just. It is available for Linux, macOS, and Windows.- If you want shell completions for
justyou can follow these instructions. - If you install
justusingcargo install justorbrew install justyou will not get shell completions without doing one extra configuration step. So on Linux it is best to usesudo apt install -y justif you want them.
- If you want shell completions for
Just commands
Note to run a just command named
allon Windows, you have to use the following:just --shell powershell.exe --shell-arg -c all
- Build:
just build - Clean:
just clean - Run examples:
just run - Run examples with release flag:
just run-release - Run examples with flamegraph profiling:
just run-flamegraph - Run tests:
just test - Run clippy:
just clippy - Build docs:
just docs - Serve docs:
just serve-docs. This is only useful if you SSH into a remote machine via VSCode (where you build and serve the docs) and want to view the docs in a browser on your local machine. - Upgrade deps:
just upgrade-deps - Run rustfmt:
just rustfmt
The following commands will watch for changes in the source folder and re-run:
- Watch run:
just watch-run - Watch all test:
just watch-all-tests - Watch one test:
just watch-one-test <test_name> - Watch clippy:
just watch-clippy - Watch macro expansion for one test:
just watch-macro-expansion-one-test <test_name>
References
- https://notes.burke.libbey.me/ansi-escape-codes/
- https://en.wikipedia.org/wiki/ANSI_escape_code
- https://www.asciitable.com/
- https://commons.wikimedia.org/wiki/File:Xterm_256color_chart.svg
- https://www.ditig.com/256-colors-cheat-sheet
- https://stackoverflow.com/questions/4842424/list-of-ansi-color-escape-sequences
- https://www.compuphase.com/cmetric.htm