gacm_rs/actions/
gnrm.rs

1use std::collections::HashSet;
2
3use colorized::Colors;
4use futures::join;
5use url::Url;
6
7use clap::{Parser, Subcommand};
8
9use crate::{
10    config::{GacmConfig, Registry},
11    logger, shell,
12};
13
14#[derive(Parser, Debug, Clone)]
15pub struct LsArgs {}
16
17#[derive(Parser, Debug, Clone)]
18pub struct UseArgs {
19    name: String,
20    #[clap(short, long)]
21    pub package: Option<String>,
22}
23
24#[derive(Subcommand, Debug, Clone)]
25pub enum Action {
26    Use(UseArgs),
27    Ls(LsArgs),
28}
29
30pub fn get_registry() -> Vec<Registry> {
31    let mut _config = GacmConfig::new();
32    let config = _config.load().unwrap();
33    let registry = config.get_registry_config();
34    registry.to_vec()
35}
36
37pub async fn query_registry(command: &str) -> String {
38    shell::run_str(command, vec!["config", "get", "registry"])
39}
40
41pub fn use_registry(_args: UseArgs) {}
42
43#[derive(Debug, Clone)]
44pub struct RegistryItem {
45    pub tag: String,
46    pub name: String,
47    pub registry: String,
48}
49
50#[derive(Clone)]
51pub struct RegistryManager {
52    list: Vec<RegistryItem>,
53}
54impl RegistryManager {
55    pub fn new(list: Vec<RegistryItem>) -> RegistryManager {
56        RegistryManager { list }
57    }
58
59    pub fn max_same_len(&self) -> usize {
60        let len = 4;
61        let mut map = HashSet::new();
62        for item in self.list.iter() {
63            if !item.registry.is_empty() {
64                map.insert(Url::parse(&item.registry).unwrap());
65            }
66        }
67        len - map.len()
68    }
69    pub fn get(&self, registry: &str) -> Vec<String> {
70        let mut display = Vec::new();
71        for item in self.list.iter() {
72            if !item.registry.is_empty() {
73                let current_url = Url::parse(&item.registry).unwrap();
74                let match_registry = Url::parse(&registry).unwrap();
75                if current_url.as_str() == match_registry.as_str() {
76                    display.push(format!("{}", &item.tag));
77                }
78            }
79        }
80        display
81    }
82}
83
84pub async fn ls_registry() {
85    let registry = get_registry();
86    let npm_registry = query_registry("npm");
87    let yarn_registry = query_registry("yarn");
88    let cnpm_registry = query_registry("cnpm");
89    let (npm_registry, yarn_registry, cnpm_registry) =
90        join!(npm_registry, yarn_registry, cnpm_registry);
91    let max_len = Registry::max_size(&registry) + 2;
92
93    let npm: RegistryItem = RegistryItem {
94        name: "npm".to_string(),
95        registry: npm_registry.to_owned(),
96        tag: colorized::colorize_this("■", Colors::GreenFg),
97    };
98    let pnpm: RegistryItem = RegistryItem {
99        name: "pnpm".to_string(),
100        registry: npm_registry.to_owned(),
101        tag: colorized::colorize_this("■", Colors::YellowFg),
102    };
103    let yarn: RegistryItem = RegistryItem {
104        name: "yarn".to_string(),
105        registry: yarn_registry,
106        tag: colorized::colorize_this("■", Colors::BlueFg),
107    };
108    let cnpm: RegistryItem = RegistryItem {
109        name: "cnpm".to_string(),
110        registry: cnpm_registry,
111        tag: colorized::colorize_this("■", Colors::RedFg),
112    };
113    let pkg_mangager = RegistryManager::new(vec![npm, yarn, pnpm, cnpm]);
114
115    let max_list_size = RegistryManager::max_same_len(&pkg_mangager);
116    println!("\n");
117    let mut tips = String::from("current: ");
118    for item in pkg_mangager.list.iter() {
119        if !item.registry.is_empty() {
120            tips.push_str(&format!("{} {} ", item.name, item.tag))
121        }
122    }
123    println!("{}", tips);
124    println!("\n");
125    for registry in registry.iter() {
126        let ouput = registry.format(max_len, &pkg_mangager, max_list_size);
127        logger::info(&ouput)
128    }
129}