1.5 KiB · text History aea77cc
use crate::data::{find_person, PplOps};
use crate::PplError;
use clap::Args;
use sea_orm::DatabaseConnection;
use std::io;

#[derive(Args, Debug)]
pub struct EditArgs {
    /// Who to edit (name, nick or id)
    pub person: String,
    /// New full name
    #[arg(long)]
    pub name: Option<String>,
    /// New nickname, shown in place of the name; "" clears it
    #[arg(long)]
    pub nick: Option<String>,
}

pub async fn do_edit(args: &EditArgs, db: &DatabaseConnection) -> Result<(), PplError> {
    let ppl = PplOps::list(db).await?;
    let p = find_person(&ppl, &args.person)?;

    if args.name.is_none() && args.nick.is_none() {
        // Nothing to change, show what's there
        println!(
            "{} ({}) nick: {}",
            p.name.trim(),
            p.id,
            p.nick.as_deref().unwrap_or("-")
        );
        return Ok(());
    }
    if args.name.as_deref().is_some_and(|n| n.trim().is_empty()) {
        return Err(io::Error::new(io::ErrorKind::InvalidInput, "name can't be empty").into());
    }

    let nick = args.nick.as_ref().map(|n| {
        let n = n.trim();
        (!n.is_empty()).then(|| n.to_string())
    });
    PplOps::update(db, p.id, args.name.clone(), nick.clone()).await?;

    let name = args.name.as_deref().map(str::trim).unwrap_or(p.name.trim());
    match nick {
        None => println!("{}: renamed", name),
        Some(None) => println!("{}: nick cleared", name),
        Some(Some(n)) => println!("{}: nick is now {}", name, n),
    }
    Ok(())
}