This commit is contained in:
2026-07-25 20:30:24 -04:00
commit 20a6a70c30
9 changed files with 2145 additions and 0 deletions
+132
View File
@@ -0,0 +1,132 @@
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<String, String> {
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<String, String> {
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<String>,
}
fn parser(args: Vec<String>) -> Result<Command,String> {
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<String,String> {
// 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<String> = 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());
}