Function console_prompt::command_loop
source · pub fn command_loop(
commands: &Vec<Command<'_>>,
context: &mut Option<Box<dyn Any>>
) -> Result<(), Box<dyn Error>>Expand description
Runs the actual command loop, providing readline output via rustyline. The context arg allows for the passing of additional ‘context’ information to maintain a state during subcalls if needed.
Examples found in repository?
examples/conversation.rs (line 56)
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
fn converse(args: &[&str], _context: &mut Option<Box<dyn Any>>)->Result<String, Box<dyn Error>>{
if args.len() == 0 {
return Ok("no name provided".to_string());
}
println!("interacting with: {}", args[0]);
let commands = vec![
Command{command: "hello", func: hello, help_output: "hello - say hello"},
Command{command: "change", func: change, help_output: "change <name> - change the name of the person with whom you're speaking"},
//Command{command: "yes", func: yes, help_output: "yes - reply yes"},
//Command{command: "no", func: no, help_output: "no - reply no"},
];
let mut name: Option<Box<dyn Any>> = Some(Box::new(args[0].to_string()));
// passing the arguments for the converse commands as context
// to the commands in the next command loop for reference
if let Err(e) = command_loop(&commands, &mut name){
eprintln!("error running interact command loop: {}", e);
}
Ok(String::new())
}
fn main(){
let commands = vec![
Command{
command: "converse",
func: converse,
help_output: "converse <name> - interact with a person"
},
];
// start the command loop with the provided commands
if let Err(e) = command_loop(&commands, &mut None){
eprintln!("error running command loop: {}", e.to_string());
}
}