change-git-user 1.2.0

Manage multiple git configurations
use crate::{write_users, User, Users};
use anyhow::Result;
use clap::ArgMatches;
use console::style;
use std::path::Path;

pub fn main<'a, P: AsRef<Path>>(mut users: Users, matches: &ArgMatches<'a>, path: P) -> Result<()> {
    let name = matches.value_of("user.name").unwrap();
    let email = matches.value_of("user.email").unwrap();
    let signing_key = matches.value_of("user.signingkey").map(String::from);
    let mut alias: String = matches.value_of("name").unwrap_or(name).into();

    let user = User {
        name: name.into(),
        email: email.into(),
        signing_key,
    };

    if users.contains_key(&alias) {
        eprintln!(
            "{log} config with name {name:?} already exists",
            log = style("[WARNING]").yellow().bold(),
            name = alias,
        );
        let mut backup_counter = 1;
        alias = loop {
            let backup_name = format!("{} ({})", alias, backup_counter);
            if !users.contains_key(&backup_name) {
                break backup_name;
            }
            backup_counter += 1;
        };
        println!("Saving as {:?}", alias);
    }
    users.insert(alias, user);

    write_users(&users, path)
}