use chrono::Utc;
use clap::{Parser, Subcommand};
use file::{load_config, write_config};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::io::{self, Write};
pub mod file;
pub mod time;
#[derive(Serialize, Deserialize, Debug, Default)]
struct Config {
entries: HashMap<String, String>,
}
#[derive(Parser)]
#[command(name = "tago")]
struct TagoCli {
#[command(subcommand)]
command: TagoCommand,
}
#[derive(Subcommand)]
enum TagoCommand {
Init { arg: Option<String> },
Days { arg: Option<String> },
All,
Clean,
}
fn prompt_for_confirmation(arg: &str) -> bool {
print!(
"The argument '{}' already exists. Are you sure you want to overwrite? (y/n): ",
arg
);
io::stdout().flush().unwrap();
let mut response = String::new();
io::stdin()
.read_line(&mut response)
.expect("Failed to read line");
response.trim().eq_ignore_ascii_case("y")
}
fn prompt_for_delete() -> bool {
print!("This will delete all saved timestamps. Are you sure you want to continue? (y/n): ");
io::stdout().flush().unwrap();
let mut response = String::new();
io::stdin()
.read_line(&mut response)
.expect("Failed to read line");
response.trim().eq_ignore_ascii_case("y")
}
fn insert_arg_into_config(arg: &str) {
let mut config = load_config();
if config.contains_key(arg) {
let Some(_) = config.get(arg) else { return };
if prompt_for_confirmation(arg) {
config.insert(arg.to_string(), Utc::now());
write_config(&config);
}
} else {
config.insert(arg.to_string(), Utc::now());
write_config(&config);
}
}
fn main() {
let cli = TagoCli::parse();
match &cli.command {
TagoCommand::Init { arg } => {
if let Some(arg) = arg {
insert_arg_into_config(arg);
} else {
insert_arg_into_config("default");
}
}
TagoCommand::Days { arg } => {
let arg = arg.clone().unwrap_or_else(|| "default".to_string());
let config = load_config();
match config.get(&arg) {
Some(arg) => {
println!("{}", time::print_elapsed_time(arg, &Utc::now()));
}
None => println!("Could not find: {}", arg),
}
}
TagoCommand::Clean => {
if !prompt_for_delete() {
return;
}
write_config(&HashMap::new());
}
TagoCommand::All => {
let config = load_config();
let now = Utc::now();
for (key, value) in &config {
println!("{}: {}", key, time::print_elapsed_time(value, &now));
}
}
}
}