use chrono::Local;
use clap::Args;
use crate::config;
use crate::date_parser;
use crate::db;
#[derive(Args)]
pub struct AddArgs {
pub title: String,
#[arg(short, long)]
pub project: Option<String>,
#[arg(short, long)]
pub due: Option<String>,
#[arg(short, long)]
pub remind: Option<String>,
#[arg(long)]
pub important: bool,
}
pub fn run(args: AddArgs) {
if args.title.is_empty() {
eprintln!("Error: title cannot be empty");
std::process::exit(1);
}
let due = args.due.as_ref().map(|s| {
date_parser::parse_fuzzy_date(s).unwrap_or_else(|| {
eprintln!(
"Error: invalid due date '{}'. Use: YYYY-MM-DD, 今日, 明日, 来週, 曜日名 etc.",
s
);
std::process::exit(1);
})
});
let db_path = config::db_path();
let conn = match db::open(&db_path) {
Ok(c) => c,
Err(_) => {
eprintln!("Error: failed to write database: {}", db_path.display());
std::process::exit(1);
}
};
let today = Local::now().date_naive();
let id = match db::add_task(
&conn,
&args.title,
args.project.as_deref(),
due,
today,
args.important,
) {
Ok(id) => id,
Err(_) => {
eprintln!("Error: failed to write database: {}", db_path.display());
std::process::exit(1);
}
};
if let Some(ref remind_str) = args.remind {
let remind_date = date_parser::parse_fuzzy_date(remind_str).unwrap_or_else(|| {
eprintln!(
"Error: invalid remind date '{}'. Use: YYYY-MM-DD, 今日, 明日, 来週, 曜日名 etc.",
remind_str
);
std::process::exit(1);
});
if db::add_remind(&conn, id, remind_date).is_err() {
eprintln!("Error: failed to write database: {}", db_path.display());
std::process::exit(1);
}
}
println!("Added: #{} {}", id, args.title);
}