vk/src/main.rs
2024-06-07 08:36:34 +02:00

161 lines
6.2 KiB
Rust

mod api;
mod args;
mod config;
mod ui;
use api::{ProjectID, VikunjaAPI};
// todo : error handling
// todo : task relations
// todo : task comments
fn main() {
let arg = args::get_args();
let config_path = dirs::home_dir().unwrap().join(".config").join("vk.toml");
if let Some(("login", login_arg)) = arg.subcommand() {
let username: &String = login_arg.get_one("username").unwrap();
let password: &String = login_arg.get_one("password").unwrap();
let totp: Option<&String> = login_arg.get_one("totp");
let host: &String = login_arg.get_one("host").unwrap();
let host = if host.starts_with("http") {
host.to_string()
} else {
format!("https://{host}")
};
let api = VikunjaAPI::new(&host, "");
let token = api.login(username, password, totp.map(|x| x.as_str()));
let config = format!("host = \"{host}\"\ntoken = \"{token}\"");
std::fs::write(config_path, config).unwrap();
std::process::exit(0);
}
let content = &std::fs::read_to_string(config_path).unwrap_or_else(|e| {
ui::print_color(
crossterm::style::Color::Red,
&format!("Could not read config file: {e}"),
);
println!("\nTo setup vk run `vk login --help`");
std::process::exit(1);
});
let config: config::Config = toml::from_str(content).unwrap();
let api = VikunjaAPI::new(&config.host, &config.token);
match arg.subcommand() {
Some(("info", task_info_arg)) => {
let task_id: &String = task_info_arg.get_one("task_id").unwrap();
ui::task::print_task_info(task_id.parse().unwrap(), &api);
}
Some(("prj", prj_arg)) => match prj_arg.subcommand() {
Some(("ls", _)) => {
ui::project::list_projects(&api);
}
Some(("add", add_prj_arg)) => {
let title: &String = add_prj_arg.get_one("title").unwrap();
let description: Option<&String> = add_prj_arg.get_one("description");
let color: Option<&String> = add_prj_arg.get_one("color");
let parent: Option<&String> = add_prj_arg.get_one("parent");
api.new_project(
title,
description.map(|x| x.as_str()),
color.map(|x| x.as_str()),
parent.map(|x| ProjectID::parse(&api, x).unwrap()),
);
}
Some(("rm", rm_prj_arg)) => {
let prj: &String = rm_prj_arg.get_one("project").unwrap();
api.delete_project(ProjectID::parse(&api, prj).unwrap());
}
_ => {
ui::project::list_projects(&api);
}
},
Some(("rm", rm_args)) => {
let task_id: &String = rm_args.get_one("task_id").unwrap();
api.delete_task(task_id.parse().unwrap());
}
Some(("assign", assign_arg)) => {
let user: &String = assign_arg.get_one("user").unwrap();
let task_id: &String = assign_arg.get_one("task_id").unwrap();
let undo = assign_arg.get_flag("undo");
if undo {
api.remove_assign_to_task(user, task_id.parse().unwrap());
} else {
api.assign_to_task(user, task_id.parse().unwrap());
}
}
Some(("comments", c_arg)) => {
let task_id: &String = c_arg.get_one("task_id").unwrap();
let comments = api.get_task_comments(task_id.parse().unwrap());
for comment in comments {
ui::task::print_comment(&comment);
}
}
Some(("labels", label_args)) => match label_args.subcommand() {
Some(("rm", rm_label_arg)) => {
let title: &String = rm_label_arg.get_one("title").unwrap();
api.remove_label(title);
}
Some(("new", new_label_arg)) => {
let description: Option<&String> = new_label_arg.get_one("description");
let color: Option<&String> = new_label_arg.get_one("color");
let title: &String = new_label_arg.get_one("title").unwrap();
api.new_label(
title.as_str(),
description.map(|x| x.as_str()),
color.map(|x| x.as_str()),
);
}
_ => {
ui::print_all_labels(&api);
}
},
Some(("label", label_args)) => {
let label: &String = label_args.get_one("label").unwrap();
let task_id: &String = label_args.get_one("task_id").unwrap();
let undo = label_args.get_flag("undo");
if undo {
api.label_task_remove(label, task_id.parse().unwrap());
} else {
api.label_task(label, task_id.parse().unwrap());
}
}
Some(("new", new_task_arg)) => {
let title: &String = new_task_arg.get_one("title").unwrap();
let project: &String = new_task_arg.get_one("project").unwrap();
let project = ProjectID::parse(&api, project).unwrap();
let task = api.new_task(title.as_str(), &project);
ui::task::print_task_info(task.id, &api);
}
Some(("done", done_args)) => {
let task_id: &String = done_args.get_one("task_id").unwrap();
let done = !done_args.get_flag("undo");
api.done_task(task_id.parse().unwrap(), done);
ui::task::print_task_info(task_id.parse().unwrap(), &api);
}
Some(("fav", fav_args)) => {
let task_id: &String = fav_args.get_one("task_id").unwrap();
let undo = fav_args.get_flag("undo");
api.fav_task(task_id.parse().unwrap(), !undo);
ui::task::print_task_info(task_id.parse().unwrap(), &api);
}
_ => {
let done = arg.get_flag("done");
let fav = arg.get_flag("favorite");
let project: Option<&String> = arg.get_one("from");
let label: Option<&String> = arg.get_one("label");
ui::task::print_current_tasks(&api, done, fav, project, label);
}
}
}