From 01b7b60dc260aa7cf1dab6c15db13a88d5d92ada Mon Sep 17 00:00:00 2001 From: Irene Knapp Date: Fri, 10 Oct 2025 00:55:51 -0700 Subject: basic structure of the interactive features of the CLI tool Change-Id: Ifec5dbbe20b2c625d448eba436620622af6c5120 --- src/main.rs | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 94 insertions(+), 2 deletions(-) (limited to 'src/main.rs') diff --git a/src/main.rs b/src/main.rs index c9de2c5..80645df 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,98 @@ #![forbid(unsafe_code)] +use crate::commands::{ Command, CommandMap, Mode }; +use crate::error::*; -fn main() { - println!("yay"); +use std::io::Write; + +mod commands; +mod error; + + +struct TopLevelMode { + command_map: Box>, +} + +impl TopLevelMode { + fn new() -> Result { + let mut command_map = Box::new(CommandMap::new()); + + command_map.insert(Command::new("help", |mode, _params| { + println!("help Print this message."); + println!("quit Exit the program."); + + Ok(Some(mode)) + }))?; + + command_map.insert(Command::new("quit", |_mode, _params| { + Ok(None) + }))?; + + Ok(TopLevelMode { command_map }) + } +} + +impl Mode for TopLevelMode { + fn prompt_text(&self) -> Result<&str> { + Ok("secrets>") + } + + fn dispatch(self: Box, params: &[&str]) + -> Result>> + { + if params.len() > 0 { + if let Some(command) = self.command_map.get(params[0]) { + (command.implementation)(self, ¶ms[1..]) + } else { + println!("No command named {}. Type help if you need help.", + params[0]); + Ok(Some(self)) + } + } else { + default_empty_command()?; + + Ok(Some(self)) + } + } +} + + +fn default_empty_command() -> Result<()> { + println!("No command? Type help if you need help."); + + Ok(()) +} + + +fn main() -> Result<()> { + help(); + + let mut current_mode: Option> + = Some(Box::new(TopLevelMode::new()?)); + + while let Some(mode) = current_mode { + if let Some(input) = prompt(mode.prompt_text()?)? { + let words: Vec<&str> = input.split_whitespace().collect(); + + current_mode = mode.dispatch(&words[..])?; + } else { + current_mode = None; + } + } + + Ok(()) +} + + +fn help() { + println!("Type a command (there are none yet)"); +} + + +fn prompt(raw: &str) -> Result> { + let mut stdout = std::io::stdout(); + stdout.write_all(format!("\n{} ", raw).as_bytes())?; + stdout.flush()?; + + Ok(std::io::stdin().lines().next().transpose()?) } -- cgit 1.4.1