[](https://crates.io/crates/interactor)
[](https://docs.rs/interactor/)
[](https://unlicense.org)
# interactor
A [Rust] library for simple (usually command-line) user interaction.
- Reading input from the console with a callback for each byte (e.g. for displaying [colorhash256] for a password)
- Selecting an item from a list using an external menu program (usually a fuzzy finder) or a built-in simple menu
- Selecting a file using the "item from a list" thing above
[Rust]: https://www.rust-lang.org
[colorhash256]: https://codeberg.org/unrelentingtech/colorhash256
## Menu program?
A program that accepts a newline-separated list of items on `stdin`, presents a UI to the user (directly on `/dev/tty` if it's a CLI; can also be a GUI), and outputs the selected item on `stdout`.
- [fzy](https://github.com/jhawthorn/fzy) (C)
- [pick](https://github.com/mptre/pick) (C)
- [fzf](https://github.com/junegunn/fzf) (Go)
- [peco](https://github.com/peco/peco) (Go)
- [percol](https://github.com/mooz/percol) (Python)
- [icepick](https://github.com/felipesere/icepick) (Rust)
- [heatseeker](https://github.com/rschmitt/heatseeker) (Rust)
- [selecta](https://github.com/garybernhardt/selecta) (Ruby)
- [hf](https://github.com/Refefer/hf) (Haskell)
- [dmenu](http://tools.suckless.org/dmenu/) (C, **X11 GUI**)
- [rofi](https://github.com/DaveDavenport/rofi) (C, **X11 GUI**)
You should let the users of your application pick their own favorite tool as a config option.
I propose the `$MENU` environment variable, like `$EDITOR`, as a place to look for user preference.
## Usage
```rust
extern crate interactor;
use std::io::Write;
use interactor::*;
fn main() {
let read_result = read_from_tty(|buf, b, tty| {
tty.write(&format!("({:?} | {})\n", buf, b).into_bytes());
}, false, false).unwrap();
println!("Read: {}", String::from_utf8(read_result).unwrap());
let chosen_ext = pick_from_list(default_menu_cmd().as_mut(), &["first", "second"], "Selection: ").unwrap();
println!("Congratulations, you chose '{}'!!", chosen_ext);
}
```
## License
This is free and unencumbered software released into the public domain.
For more information, please refer to the `UNLICENSE` file or [unlicense.org](https://unlicense.org).