fui
Add CLI & form interface to your program.
Basic example
cargo.toml
[dependencies]
fui = "2.1"
clap
(experimental)
Using with extern crate clap;
extern crate fui;
use clap::{App, Arg};
use fui::Fui;
use std::env;
// regular clap code
let app = App::new("some-app").arg(
Arg::with_name("some-switch")
.long("arg-long")
.help("arg-help"),
);
// extra fui code
let mut _arg_vec: Vec<String> = env::args().collect();
if _arg_vec.len() <= 1 {
_arg_vec = Fui::from(&app).get_cli_input();
}
// regular clap code
let matches = app.get_matches_from(_arg_vec);
clap
Using without // Example showing imagined CLI app. with two actions
#[macro_use]
extern crate clap;
extern crate fui;
use fui::{Fui, Value};
use fui::form::FormView;
use fui::fields::Text;
fn hdlr(v: Value) {
println!("user input (from fn) {:?}", v);
}
fn main() {
Fui::new(crate_name!())
.action(
"action1",
"help for action1",
FormView::new().field(Text::new("action1-data").help("help for action1 data")),
|v| {
println!("user input (from closure) {:?}", v);
},
)
.action(
"action2",
"help for action2",
FormView::new().field(Text::new("action2-data").help("help for action2 data")),
hdlr,
)
.version(crate_version!())
.about(crate_description!())
.author(crate_authors!())
.run();
}
This will make the program automatically working in 2 modes:
-
Ready for parsing CLI arguments, like here:
$ ./app_basic -h app_basic 1.0.0 xliiv <tymoteusz.jankowski@gmail.com> An Example program which has CLI & form interface (TUI) USAGE: app_basic [SUBCOMMAND] FLAGS: -h, --help Prints help information -V, --version Prints version information SUBCOMMANDS: action1 help for action1 action2 help for action2 help Prints this message or the help of the given subcommand(s)
-
Ready for getting user input from easy and discoverable TUI interface, like image below:
More examples
Screens
Clap support
Implemented features
- switch arguments
- positional arguments
- option arguments
- global arguments
- subcommands (single level)
To be implemented
- conflicts_with
- requires
- validators
- min/max/exact number of values for
- positional args
- options args
- groups
- conditional defaults
- custom delimeter
TODO
- find a solution for long help messages
- ctrl+enter submits (#151)
- handle unwraps
Ideas
.validator(OneOf || Regex::new("v\d+\.\d+\.\d+")).unwrap()
?- support user's history?
- checkboxes: automatic toggle on char(+alt)?
- replace
views::Autocomplete
&views::Multiselect
with a new implementation ofAutocomplete
Release Steps
# create a new branch with updated files, similarly to the following
# https://github.com/xliiv/fui/commit/b44577541ee9b965b0b1e67169cac46222317901
git checkout -b vx.x.x # where vx.x.x is e.g. v1.0.0
git commit -m "Bump version to vx.x.x"
# login as here https://doc.rust-lang.org/cargo/reference/publishing.html
cargo login
# check if branch is correct
cargo publish --dry-run
# if OK, then publish
cargo publish
# push the branch
git push origin vx.x.x
# merge the vx.x.x branch created a few steps before
# tag branch
git tag -a "vx.x.x" -m "Tag vx.x.x"