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(®istry).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(®istry) + 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}