use crate::cli::parser::Commands;
use crate::core::add::AddLogic;
use crate::db::pool::DbPool;
use crate::errors::{AppError, AppResult};
use crate::models::location::Location;
use crate::utils::date;
use crate::utils::time::parse_optional_time;
pub fn handle(cmd: &Commands, cfg: &crate::config::Config) -> AppResult<()> {
if let Commands::Add {
date,
pos,
start,
lunch,
work_gap,
no_work_gap,
end,
edit_pair,
edit,
} = cmd
{
let d = date::parse_date(date).ok_or_else(|| AppError::InvalidDate(date.to_string()))?;
let pos_final = match pos {
Some(code) => Location::from_code(code).ok_or_else(|| {
AppError::InvalidPosition(format!(
"Invalid location code '{}'. Use a valid code such as 'office', 'remote', 'customer', ...",
code
))
})?,
None => Location::Office,
};
let start_parsed = parse_optional_time(start.as_ref());
let end_parsed = parse_optional_time(end.as_ref());
let lunch_opt = *lunch;
let mut pool = DbPool::new(&cfg.database)?;
let work_gap: Option<bool> = if *work_gap {
Some(true)
} else if *no_work_gap {
Some(false)
} else {
None
};
AddLogic::apply(
&mut pool,
d,
pos_final,
start_parsed.unwrap(),
lunch_opt,
work_gap,
end_parsed.unwrap(),
*edit,
*edit_pair,
pos.clone(), )?;
}
Ok(())
}