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}