use reqwest::blocking; const COMMANDS : [&str; 7] = [ "help", "version", "show", "add", "rm", "mv", "setdb" ]; fn dbgprint(s: &str) { if false { println!("{}", s); } } // todo: // * add desc // * add multiple tags support // * add "inbox default" // * add nice layout printout fn help_menu() -> String { let cmds = vec![ "./todo help | --help | -h", "./todo version | --version", "./todo show [-b]" , "./todo add taskname", "./todo rm taskname", // "./todo add taskname [desc] [tag] (use to edit, collision --force)", // "./todo add -b bucketname [category] (used to edit, collision --force)", // "./todo rm -b bucketname (also removes tasks)", // "./todo rm -b bucketname -s target-bucket", // "./todo mv taskname bucketname", // "./todo mv bucketname newbucketname" // "./todo setdb filepath", ]; cmds.join("\n") } fn send_get(url: &String) -> Result { println!("Sending get: {}", url); let body = match reqwest::blocking::get(url) { Ok(res) => { if let Ok(inner) = res.text() { inner } else { format!("error getting test") } } Err(err) => format!("Failed to get") }; Ok(body) } fn send_post(url: &String, data: &String) -> Result { let client = reqwest::blocking::Client::new(); if let Ok(res) = client.post(url) .body(data.clone()) .send() { return Ok(format!("")) } Err(format!("failed to post")) } struct Command { cmd: String, args: Vec, } fn parser(args: Vec) -> Result { if !COMMANDS.contains(&&args[1].as_str()) { println!("UNKNOWN COMMAND, try one of the following"); return Err(format!("Unknown command")); } Ok(Command { cmd: args[1].clone(), args: args.to_vec()}) } fn handler(command: &Command, url: &String) -> Result { // these commands do not require db access if command.cmd == "help" || command.args.contains(&String::from("--help")) || command.args.contains(&String::from("-h")) { return Ok(help_menu()); } else if command.cmd == "version" || command.args.contains(&String::from("--version")) { let version = env!("CARGO_PKG_VERSION"); return Ok(format!("{}", version)); } // probably need to hit the server if command.cmd == "show" { let url_with_query = url.clone() + &format!("?action=show"); send_get(&url_with_query) } else if command.cmd == "add" { if command.args.len() < 3 { return Err(format!("ERR: Not enough args for adding")); } let name = &command.args[2]; // let mut bucket = ""; // if command.args.len() > 3 { // bucket = &command.args[3]; // } let url_with_query = url.clone() + &format!("?action=add"); send_post(&url_with_query, &format!("{}", name)) } else if command.cmd == "rm" { if command.args.len() < 3 { println!("ERR: Not enough args for removing"); return Err(format!("Err: Not enough args for removing")); } let name = &command.args[2]; let url_with_query = url.clone() + &format!("?action=rm"); send_post(&url_with_query, &format!("{}", name)) } else { Ok(help_menu()) } } fn main() { let args : Vec = std::env::args().collect(); let url = format!("http://localhost:8001/"); let parsed = parser(args); if let Ok(cmd) = parsed { println!("{}", handler(&cmd, &url).unwrap()); return; } println!("parsing failed"); println!("{}", help_menu()); }