49 lines
1.5 KiB
Rust
49 lines
1.5 KiB
Rust
|
//! Example using Repl with Context
|
||
|
use reedline_repl_rs::clap::{Arg, ArgMatches, Command};
|
||
|
use reedline_repl_rs::{Repl, Result};
|
||
|
use std::collections::VecDeque;
|
||
|
|
||
|
#[derive(Default)]
|
||
|
struct Context {
|
||
|
list: VecDeque<String>,
|
||
|
}
|
||
|
|
||
|
/// Append name to list
|
||
|
fn append(args: ArgMatches, context: &mut Context) -> Result<Option<String>> {
|
||
|
let name: String = args.value_of("name").unwrap().to_string();
|
||
|
context.list.push_back(name);
|
||
|
let list: Vec<String> = context.list.clone().into();
|
||
|
|
||
|
Ok(Some(list.join(", ")))
|
||
|
}
|
||
|
|
||
|
/// Prepend name to list
|
||
|
fn prepend(args: ArgMatches, context: &mut Context) -> Result<Option<String>> {
|
||
|
let name: String = args.value_of("name").unwrap().to_string();
|
||
|
context.list.push_front(name);
|
||
|
let list: Vec<String> = context.list.clone().into();
|
||
|
|
||
|
Ok(Some(list.join(", ")))
|
||
|
}
|
||
|
|
||
|
fn main() -> Result<()> {
|
||
|
let mut repl = Repl::new(Context::default())
|
||
|
.with_name("MyList")
|
||
|
.with_version("v0.1.0")
|
||
|
.with_description("My very cool List")
|
||
|
.with_command(
|
||
|
Command::new("append")
|
||
|
.arg(Arg::new("name").required(true))
|
||
|
.about("Append name to end of list"),
|
||
|
append,
|
||
|
)
|
||
|
.with_command(
|
||
|
Command::new("prepend")
|
||
|
.arg(Arg::new("name").required(true))
|
||
|
.about("Prepend name to front of list"),
|
||
|
prepend,
|
||
|
)
|
||
|
.with_on_after_command(|context| Ok(Some(format!("MyList [{}]", context.list.len()))));
|
||
|
repl.run()
|
||
|
}
|