#repl #interpreter #clap

reedline-repl-rs

Library to generate a fancy REPL for your application based on reedline and clap

12 releases (4 stable)

1.0.3 Jan 24, 2023
1.0.2 Jun 9, 2022
0.3.2 Jun 8, 2022
0.2.3 Jun 6, 2022
0.1.0 Jun 5, 2022

#118 in Command-line interface

Download history 45/week @ 2022-10-13 63/week @ 2022-10-20 22/week @ 2022-10-27 56/week @ 2022-11-03 34/week @ 2022-11-10 31/week @ 2022-11-17 45/week @ 2022-11-24 16/week @ 2022-12-01 83/week @ 2022-12-08 65/week @ 2022-12-15 40/week @ 2022-12-22 61/week @ 2022-12-29 101/week @ 2023-01-05 25/week @ 2023-01-12 98/week @ 2023-01-19 168/week @ 2023-01-26

397 downloads per month
Used in matrix65

MIT license

47KB
805 lines

reedline-repl-rs

Library to help you create a fancy REPL for your application based on nushell's reedline.

License: MIT Crates.io Documentation

Features:

  • Popular clap crate Command used as configuration interface
  • General editing functionality, that should feel familiar coming from other shells (e.g. bash, fish, zsh).
  • Interactive tab-completion with graphical selection menu
  • Fish-style history autosuggestion hints
  • History with interactive search options (optionally persists to file, can support multiple sessions accessing the same file)
  • Configurable keybindings (default emacs-style bindings).
  • Configurable prompt with hooks to update after commands run
  • Command Syntax highlighting
  • Feature-flag for async support
  • Tip: Search history with CTRL+R, clear input with CTRL+C, exit repl with CTRL+D

Basic example code:

//! Minimal example
use reedline_repl_rs::clap::{Arg, ArgMatches, Command};
use reedline_repl_rs::{Repl, Result};

/// Write "Hello" with given name
fn hello<T>(args: ArgMatches, _context: &mut T) -> Result<Option<String>> {
    Ok(Some(format!(
        "Hello, {}",
        args.get_one::<String>("who").unwrap()
    )))
}

fn main() -> Result<()> {
    let mut repl = Repl::new(())
        .with_name("MyApp")
        .with_version("v0.1.0")
        .with_description("My very cool app")
        .with_banner("Welcome to MyApp")
        .with_command(
            Command::new("hello")
                .arg(Arg::new("who").required(true))
                .about("Greetings!"),
            hello,
        );
    repl.run()
}

Running the example above:

Colored Terminal Output

Welcome to MyApp
MyApp〉help
MyApp v0.1.0: My very cool app

COMMANDS:
    hello    Greetings!
    help     Print this message or the help of the given subcommand(s)

MyApp〉help hello
hello
Greetings!

USAGE:
    hello <who>

ARGS:
    <who>

OPTIONS:
    -h, --help    Print help information
MyApp〉hello Friend
Hello, Friend
MyApp〉

Testing

cargo test --features async

Will run the doc tests (compiling the examples). Notice, the examples/async.rs requires the async feature.

Thanks

Forked from repl-rs by Jacklund, changed to use reedline which is an advanced readline clone and the base of nushell.

Dependencies

~5–13MB
~234K SLoC