Skip to content
Add CLI & form interface to your program. Docs: https://docs.rs/fui
Rust
Branch: master
Clone or download

Latest commit

xliiv Update cursive to 0.14 (#125)
Update cursive to 0.14
Latest commit 10440e3 Jan 19, 2020

Files

Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
doc Use asciinema for clap example (instead of gif) (#120) May 1, 2019
examples Update cursive to 0.14 Jan 19, 2020
src Update cursive to 0.14 Jan 19, 2020
.gitignore
.travis.yml Update .travis.yml Jan 19, 2020
CHANGELOG.md Bump version to 1.0 (#121) May 1, 2019
Cargo.toml Update cursive to 0.14 Jan 19, 2020
LICENSE Initial commit Feb 5, 2018
README.md Bump version to 1.0 (#121) May 1, 2019

README.md

fui

docs.rs crates.io Build Status MIT licensed

Add CLI & form interface to your program.

Basic example

cargo.toml

[dependencies]
fui = "1.0"

Using with clap (experimental)

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);

asciicast

Using without clap

// 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:

  1. 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)
  2. Ready for getting user input from easy and discoverable TUI interface, like image below:

More examples

Here

Screens

app_basic.rs example app_ln_like.rs example app_tar_like.rs example

Clap support

Implemented features

  • switch arguments
  • positional arguments
  • option arguments
  • global arguments
  • subcommands (single level)

To be implemented

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 of Autocomplete
You can’t perform that action at this time.