toru/src/args.rs

252 lines
6.9 KiB
Rust

use crate::tasks;
use crate::tasks::Id;
use std::path;
impl Args {
pub fn accept_command() -> Command {
use clap::Parser;
Args::parse().command
}
}
#[derive(clap::Parser, Debug)]
pub struct Args {
#[clap(subcommand)]
pub command : Command,
}
#[derive(clap::Subcommand, Debug, PartialEq, Eq)]
#[clap(version, help_short='h', about, author, global_setting=clap::AppSettings::DisableHelpSubcommand)]
pub enum Command {
/// Create a new task.
New {
#[clap(short, long)]
name : String,
#[clap(short, long)]
info : Option<String>,
#[clap(short, long)]
tag : Vec<String>,
#[clap(short, long)]
dependency : Vec<Id>,
#[clap(short, long, value_enum)]
priority : Option<tasks::Priority>,
/// Due date, expecting format yyyy-mm-ddThh:mm:ss
#[clap(long)]
due : Option<chrono::NaiveDateTime>,
},
/// Displays the specified task in detail.
View {
id_or_name : String,
},
/// Edit a task directly.
Edit {
id_or_name : String,
/// Edit the info specifically in its own file.
#[clap(short, long)]
info : bool,
},
/// Delete a task (move file to trash).
Delete {
id_or_name : String,
},
/// Mark a task as complete.
Complete {
id_or_name : String,
},
/// Run Git commands at the root of the vault.
#[clap(trailing_var_arg=true)]
Git {
args : Vec<String>,
},
/// Run Subversion commands at the root of the vault.
#[clap(trailing_var_arg=true)]
Svn {
args : Vec<String>,
},
/// Adds the recommended .gitignore file to the vault.
#[clap(name="gitignore")]
GitIgnore,
/// Lists tasks according to the specified fields, ordering and filters.
List {
/// Use an existing profile for list options, ignoring other arguments.
#[clap(long)]
profile : Option<String>,
#[clap(flatten)]
options : ListOptions,
},
/// Adds the recommended svn:ignore property to the top level of the vault.
#[clap(name="svn:ignore")]
SvnIgnore,
/// For tracking time against a task.
Track {
id_or_name : String,
#[clap(short='H', default_value_t=0)]
hours : u16,
#[clap(short='M', default_value_t=0)]
minutes : u16,
/// Date for the time entry [default: Today]
#[clap(short, long)]
date : Option<chrono::NaiveDate>,
/// Message to identify the time entry.
#[clap(short, long)]
message : Option<String>,
},
/// For statistics about the state of your vault.
#[clap(subcommand)]
Stats(StatsCommand),
/// For making changes to global configuration.
#[clap(subcommand)]
Config(ConfigCommand),
/// Commands for interacting with vaults.
#[clap(subcommand)]
Vault(VaultCommand),
/// Switches to the specified vault.
Switch {
name : String,
},
}
#[derive(clap::StructOpt, Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub struct ListOptions {
/// Which columns to include.
#[clap(short, value_enum)]
pub column : Vec<Column>,
/// Field to order by [default: id].
#[clap(long, value_enum)]
pub order_by : Option<OrderBy>,
/// Sort ascending on descending [default: asc].
#[clap(long, value_enum)]
pub order : Option<Order>,
/// Tags to include.
#[clap(short, long)]
pub tag : Vec<String>,
/// Tags to exclude.
#[clap(short, long)]
pub exclude_tag : Vec<String>,
/// Priority levels to include.
#[clap(short, long, value_enum)]
pub priority : Vec<tasks::Priority>,
/// Only include tasks due before a certain date (inclusive).
#[clap(long)]
pub due_before : Option<chrono::NaiveDate>,
/// Only include tasks due after a certain date (inclusive).
#[clap(long)]
pub due_after : Option<chrono::NaiveDate>,
/// Only include tasks created before a certain date (inclusive).
#[clap(long)]
pub created_before : Option<chrono::NaiveDate>,
/// Only include tasks created after a certain date (inclusive).
#[clap(long)]
pub created_after : Option<chrono::NaiveDate>,
/// Include completed tasks in the list.
#[clap(long)]
pub include_completed : bool,
/// Only include tasks with no dependencies [alias: bottom-level].
#[clap(long, alias="bottom-level")]
pub no_dependencies : bool,
/// Only include tasks with no dependents [alias: top-level].
#[clap(long, alias="top-level")]
pub no_dependents : bool,
}
#[derive(Default, Clone, Copy, Debug, PartialEq, Eq, clap::ValueEnum, serde::Serialize, serde::Deserialize)]
pub enum Order {
#[default]
Asc,
Desc,
}
#[derive(Hash, Clone, Copy, Debug, PartialEq, Eq, clap::ValueEnum, serde::Serialize, serde::Deserialize)]
pub enum Column {
Due,
Priority,
Created,
Tracked,
Tags,
Status,
}
#[derive(Default, Clone, Copy, Debug, PartialEq, Eq, clap::ValueEnum, serde::Serialize, serde::Deserialize)]
pub enum OrderBy {
#[default]
Id,
Name,
Due,
Priority,
Created,
Tracked,
}
#[derive(clap::Subcommand, Debug, PartialEq, Eq)]
pub enum StatsCommand {
/// View time tracked per tag recently.
Tracked {
#[clap(short, long, default_value_t=7)]
days : u16,
},
/// View recently completed tasks.
Completed {
#[clap(short, long, default_value_t=7)]
days : u16,
},
}
#[derive(clap::Subcommand, Debug, PartialEq, Eq)]
pub enum ConfigCommand {
/// For checking or changing default text editor command.
Editor {
/// Command to launch editor. Omit to view current editor.
editor : Option<String>,
},
/// For working with profiles for the list command.
#[clap(subcommand)]
Profile(ProfileCommand),
}
#[derive(clap::Subcommand, Debug, PartialEq, Eq)]
pub enum ProfileCommand {
New {
/// Name of the new profile.
name : String,
#[clap(flatten)]
options : ListOptions,
},
Delete {
/// Name of the profile to delete.
name : String,
},
/// List names of currently set up profiles.
List,
}
#[derive(clap::Subcommand, Debug, PartialEq, Eq)]
pub enum VaultCommand {
/// Creates a new vault at the specified location of the given name.
New {
name : String,
path : path::PathBuf,
},
/// Disconnects the specified vault from toru, without altering the files.
Disconnect {
name : String,
},
/// Connects an existing fault to toru.
Connect {
name : String,
path : path::PathBuf,
},
/// Deletes the specified vault along with all of its data.
Delete {
name : String,
},
/// Lists all configured vaults.
List,
/// For renaming an already set up vault.
Rename {
old_name : String,
new_name : String,
}
}