gacm_rs/actions/
gacm.rs

1use crate::{
2    config::{GacmConfig, User},
3    logger, shell,
4};
5use clap::{Parser, Subcommand};
6use std::str;
7
8#[derive(Subcommand, Debug, Clone)]
9pub enum Action {
10    Use(UseArgs),
11    Ls(LsArgs),
12}
13
14#[derive(Parser, Debug, Clone)]
15pub struct LsArgs {}
16
17#[derive(Debug, Parser, Clone)]
18pub struct UseArgs {
19    name: String,
20    #[clap(short, long)]
21    pub local: bool,
22    #[clap(short, long)]
23    pub global: bool,
24    #[clap(short, long)]
25    pub system: bool,
26}
27
28pub fn get_users() -> Vec<User> {
29    let mut _config = GacmConfig::new();
30    let config = _config.load().unwrap();
31    let _account = config.get_use_config();
32    _account.to_vec()
33}
34
35pub fn use_account(args: UseArgs) {
36    let env = if args.system {
37        "system"
38    } else if args.global {
39        "global"
40    } else {
41        "local"
42    };
43    let _account: Vec<User> = get_users();
44    let current = _account.iter().find(|user| user.alias == args.name);
45    if let Some(cur) = current {
46        shell::run("git", vec!["config", "--local", "user.name", &cur.name]);
47        shell::run("git", vec!["config", "--local", "user.email", &cur.email]);
48        println!("\n");
49        logger::success(&format!(
50            "git user changed [{}]:{}({})",
51            env, cur.alias, cur.name
52        ))
53    }
54}
55
56pub fn ls_account() {
57    let account: Vec<User> = get_users();
58    let max_len = User::max_size(&account) + 8;
59    let current_user = shell::run_str("git", vec!["config", "user.name"]);
60    let current_email = shell::run_str("git", vec!["config", "user.email"]);
61
62    println!("\n");
63    for user in account.iter() {
64        let is_current = if user.name == current_user && user.email == current_email {
65            true
66        } else {
67            false
68        };
69
70        let ouput = user.format(max_len, is_current);
71        logger::info(&ouput)
72    }
73}