You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
132 lines
4.9 KiB
132 lines
4.9 KiB
use cassiopeia::{meta, Cassiopeia};
|
|
use clap::{App, Arg, SubCommand};
|
|
|
|
fn main() {
|
|
let cli = App::new(meta::NAME)
|
|
.version(meta::VERSION)
|
|
.about(meta::ABOUT)
|
|
.after_help("To learn more on how to use cassiopeia, check out the documentation \
|
|
at https://git.spacekookie.de/kookienomicon/tree/apps/cassiopeia
|
|
If you want to report a bug, please do so on my mailing list: lists.sr.ht/~spacekookie/public-inbox")
|
|
.author(meta::AUTHOR)
|
|
.max_term_width(120)
|
|
.setting(clap::AppSettings::SubcommandRequiredElseHelp)
|
|
.global_settings(&[
|
|
clap::AppSettings::DisableHelpSubcommand,
|
|
clap::AppSettings::VersionlessSubcommands,
|
|
])
|
|
.arg(
|
|
Arg::with_name(meta::ARG_FILE)
|
|
.short("f")
|
|
.long("file")
|
|
.help(meta::ARG_FILE_ABOUT)
|
|
.default_value("./time.cass")
|
|
.takes_value(true),
|
|
)
|
|
.subcommand(SubCommand::with_name(meta::CMD_UPDATE).about(meta::CMD_UPDATE_ABOUT))
|
|
.subcommand(
|
|
SubCommand::with_name(meta::CMD_START)
|
|
.about(meta::CMD_START_ABOUT)
|
|
.arg(Arg::with_name(meta::ARG_ROUNDING).short("r").long("no-round").help(meta::ARG_ROUNDING_ABOUT)),
|
|
)
|
|
.subcommand(
|
|
SubCommand::with_name(meta::CMD_STOP)
|
|
.about(meta::CMD_STOP_ABOUT)
|
|
.arg(Arg::with_name(meta::ARG_ROUNDING).short("r").long("no-round").help(meta::ARG_ROUNDING_ABOUT)),
|
|
)
|
|
.subcommand(
|
|
SubCommand::with_name(meta::CMD_INVOICE)
|
|
.about(meta::CMD_INVOICE_ABOUT)
|
|
.arg(
|
|
Arg::with_name(meta::ARG_CLIENT)
|
|
.short("c")
|
|
.long("client")
|
|
.takes_value(true)
|
|
.help(meta::ARG_CLIENT_ABOUT),
|
|
)
|
|
.arg(
|
|
Arg::with_name(meta::ARG_PROJECT)
|
|
.short("p")
|
|
.long("project")
|
|
.takes_value(true)
|
|
.help(meta::ARG_PROJECT_ABOUT),
|
|
)
|
|
.arg(
|
|
Arg::with_name(meta::ARG_GEN_YAML)
|
|
.short("g")
|
|
.long("gen")
|
|
.help(meta::ARG_GEN_YAML_ABOUT),
|
|
)
|
|
.arg(
|
|
Arg::with_name(meta::ARG_CLIENT_DB)
|
|
.long("client-db")
|
|
.takes_value(true)
|
|
.help(meta::ARG_CLIENT_DB_ABOUT),
|
|
)
|
|
)
|
|
.subcommand(SubCommand::with_name(meta::CMD_STAT).about(meta::CMD_STAT_ABOUT))
|
|
.get_matches();
|
|
|
|
let cass_file = cli.value_of(meta::ARG_FILE).unwrap();
|
|
let mut cass = match Cassiopeia::load(cass_file) {
|
|
Some(cf) => cf,
|
|
None => {
|
|
eprintln!(
|
|
"Invalid CASS file '{}'; file not found, or unparsable.",
|
|
cass_file
|
|
);
|
|
std::process::exit(2);
|
|
}
|
|
};
|
|
|
|
// Parse the matches generated by clap
|
|
match cli.subcommand() {
|
|
("start", Some(ops)) => {
|
|
// This parameter turns rounding OFF
|
|
let round = ops.is_present(meta::ARG_ROUNDING);
|
|
match cass.start(!round) {
|
|
Some(()) => println!("Started session!"),
|
|
None => {
|
|
eprintln!("Failed to start session...");
|
|
std::process::exit(1);
|
|
}
|
|
}
|
|
}
|
|
("stop", Some(ops)) => {
|
|
// This parameter turns rounding OFF
|
|
let round = ops.is_present(meta::ARG_ROUNDING);
|
|
match cass.stop(!round) {
|
|
Some(()) => println!("Stopped session!"),
|
|
None => {
|
|
eprintln!("Failed to stop session...");
|
|
std::process::exit(1);
|
|
}
|
|
}
|
|
}
|
|
("invoice", _) => {
|
|
println!("Invoice command only partially implemented! No generation is supported");
|
|
match cass.invoice().run() {
|
|
Some(()) => println!("Added INVOICE block"),
|
|
None => {
|
|
eprintln!("Failed to add INVOICE block...");
|
|
std::process::exit(1);
|
|
}
|
|
}
|
|
}
|
|
("update", _) => match cass.update() {
|
|
Some(()) => println!("Updated file to new version: {}", meta::VERSION),
|
|
None => {
|
|
eprintln!("Failed to update file...");
|
|
std::process::exit(1);
|
|
}
|
|
},
|
|
(meta::CMD_STAT, _) => match cass.stat() {
|
|
Some(s) => println!("{}", s),
|
|
None => {
|
|
eprintln!("Failed to collect time statistics...");
|
|
std::process::exit(1);
|
|
}
|
|
},
|
|
(_, _) => todo!(),
|
|
}
|
|
}
|
|
|