161 lines
6.2 KiB
Rust
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);
|
|
}
|
|
}
|
|
}
|