1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 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 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
//! A helper library for implementing low-level terminal command line interfaces, //! like those on embedded bare-bones environments with UART ports. //! //! The library doesn't use Rust's ```std``` library, but requires the ```alloc``` //! and ```collections``` libraries for heap memory allocation and vector manipulation. //! //! Custom commands can be easily added by implementing the ```CliCommand``` trait. //! //! # Example //! //! ``` //! #![feature(convert)] //! # use terminal_cli::*; //! # use std::io; //! # use std::io::Write; //! let help = CliCommandKeyword { //! keyword: "help".to_string(), //! action: |line, cli| { //! cli.output_line("Help here!"); //! } //! }; //! //! // Adds "set time <HH:mm>" and "get time" commands. No parsing here. //! let time = CliPropertyVar { //! var_name: "time".to_string(), //! var_value: "11:15".to_string(), //! val_hint: "HH:mm".to_string(), //! //! var_output: |v| { v.to_string() }, //! var_input: |v| { //! if v.len() > 0 { Some(v.to_string()) } //! else { None } //! } //! }; //! //! // For this test, a ```stdout``` terminal. Isn't included in the //! // library as it's meant for bare-bones usage - no std library. //! struct StdoutTerminal; //! impl CliTerminal for StdoutTerminal { //! fn output_line(&mut self, line: &str) { //! println!("{}", line); //! } //! } //! //! let mut commands = vec![ //! Box::new(help) as Box<CliCommand>, //! Box::new(time) as Box<CliCommand> //! ]; //! //! let mut term = StdoutTerminal; //! //! // Execute a line buffer //! cli_execute("help", commands.as_mut_slice(), &mut term); //! //! // Try to autocomplete the active buffer. Will return a summary of all commands. //! let autocomplete = cli_try_autocomplete("", commands.as_mut_slice()); //! //! //! // Serial terminal input handling //! struct StdoutPromptOutput; //! impl CliPromptTerminal for StdoutPromptOutput { //! fn print_bytes(&self, bytes: &[u8]) { //! io::stdout().write(bytes); //! } //! } //! //! let mut prompt = CliPromptAutocompleteBuffer::new("#".to_string()); //! // help + newline //! let keyboard_input = vec!['h' as u8, 'e' as u8, 'l' as u8, //! 0x7f /* backspace */, 'l' as u8, 'p' as u8, 0x0d /* \r */ ]; //! //! for byte in keyboard_input { //! prompt.handle_received_byte(byte, &StdoutPromptOutput, //! commands.as_mut_slice(), &mut term); //! } //! ``` #![no_std] #![feature(core, alloc, no_std, macro_reexport, unboxed_closures, collections, convert)] extern crate core; extern crate alloc; #[macro_use(vec, format)] extern crate collections; // for tests #[cfg(test)] #[macro_use(println, assert_eq, print, panic)] extern crate std; mod cli; mod commands; mod utils; mod prompt_buffer; pub use cli::*; pub use utils::*; pub use commands::*; pub use prompt_buffer::*; #[cfg(test)] mod tests;