use crate::{
commands::{Cli, Config, Result, current_job, from_start},
jobber::JobberWork,
print_tip,
};
use clap::Parser;
use color_print::cprintln;
#[derive(Parser, Debug)]
pub(crate) struct Start {
#[clap(default_value = "now", verbatim_doc_comment)]
start_time: String,
#[clap(short, long)]
subject: Option<String>,
#[clap(short, long, value_delimiter = ',')]
tags: Vec<String>,
#[clap(short, long)]
job: Option<usize>,
#[clap(short, long, requires = "job")]
no_select: bool,
}
impl Start {
pub(crate) fn run(&self, cli: &Cli) -> Result<()> {
let mut config = Config::load()?;
let mut database = cli.open_database()?;
let job_id = self.job.unwrap_or(current_job(&config, &database)?);
database.start_work(
job_id,
from_start(&self.start_time)?,
self.subject.clone(),
self.tags.clone(),
)?;
cli.close_database(database)?;
cprintln!("Successfully started work in job {job_id}");
if !self.no_select && config.current_job != Some(job_id) {
config.current_job = Some(job_id);
cprintln!("Selected job <s>{job_id}</>.");
}
print_tip!(cli);
print_tip!(cli, "Use <s>jobber end</> to end work.");
Ok(())
}
}
#[cfg(test)]
mod test {
use crate::{commands::from_start_ex, entities::DateTime};
#[test]
fn start() {
fn from_start(start: &str) -> String {
let now = DateTime::from_ymd(2026, 6, 1).unwrap();
from_start_ex(&start, now).unwrap().to_string()
}
assert_eq!(from_start("now"), "2026-06-01 00:00:00");
assert_eq!(from_start("2026-05-31 13:15"), "2026-05-31 13:15:00");
assert_eq!(from_start("13:15"), "2026-06-01 13:15:00");
assert_eq!(from_start("15m"), "2026-05-31 23:45:00");
assert_eq!(from_start("+15m"), "2026-06-01 00:15:00");
assert_eq!(from_start("8h"), "2026-05-31 16:00:00");
assert_eq!(from_start("+8h"), "2026-06-01 08:00:00");
}
}