jobber 1.1.6-alpha

Minimalistic console work time tracker
use crate::commands::{Cli, Config, Result, configure::ConfigItems};
use clap::Parser;
use color_print::cprintln;
use inquire::Select;

/// Edit configuration item(s)
#[derive(Parser, Debug)]
pub(crate) struct ConfigSet {
    /// Configuration item name
    item: Option<ConfigItems>,
}

impl ConfigSet {
    pub(crate) fn run(&self, _: &Cli) -> Result<()> {
        let mut config = Config::load()?;
        match &self.item {
            Some(ConfigItems::TableStyle) => set_table_style(&mut config)?,
            Some(ConfigItems::DeleteEmptyJobAfterInvoice) => {
                delete_empty_job_after_export(&mut config)?
            }
            None => {
                set_table_style(&mut config)?;
                delete_empty_job_after_export(&mut config)?
            }
        };
        Ok(())
    }
}

fn delete_empty_job_after_export(config: &mut Config) -> Result<()> {
    let values = vec!["delete", "leave"];
    let start = match config.delete_empty_job_after_export {
        true => 0,
        false => 1,
    };
    if let Some(val) = Select::new("Delete empty jobs after invoice export default?", values)
        .with_starting_cursor(start)
        .prompt_skippable()?
    {
        config.delete_empty_job_after_export = val == "delete"
    }
    Ok(())
}

fn set_table_style(config: &mut Config) -> Result<()> {
    let values = vec!["rounded", "markdown", "empty"];
    let start = values
        .iter()
        .position(|value| value == &config.table_style.to_string())
        .expect("internal error");
    if let Some(val) = Select::new("Table style?", values)
        .with_starting_cursor(start)
        .prompt_skippable()?
    {
        config.table_style = val.parse()?;
        cprintln!("Table style set to <s>{val}</>");
    }
    Ok(())
}