apicurio_cli/commands/
registry.rs

1use crate::config::{load_global_config, save_global_config, AuthConfig, RegistryConfig};
2use anyhow::{anyhow, Result};
3use clap::Subcommand;
4use dialoguer::Select;
5use std::io::{stdin, stdout, Write};
6
7#[derive(Subcommand, Debug)]
8pub enum RegistryCommands {
9    /// List all global registries
10    List,
11    /// Add a new global registry
12    Add,
13    /// Remove a global registry by name
14    Remove { name: String },
15}
16
17fn prompt(msg: &str) -> Result<String> {
18    print!("{msg}: ");
19    stdout().flush()?;
20    let mut input = String::new();
21    stdin().read_line(&mut input)?;
22    let val = input.trim().to_string();
23    if val.is_empty() {
24        Err(anyhow!("{} cannot be empty", msg))
25    } else {
26        Ok(val)
27    }
28}
29
30pub async fn run(cmd: RegistryCommands) -> Result<()> {
31    let mut global = load_global_config()?;
32
33    match cmd {
34        RegistryCommands::List => {
35            if global.registries.is_empty() {
36                println!("(no global registries defined)");
37            } else {
38                for r in &global.registries {
39                    println!(" - {} → {} (type={:?})", r.name, r.url, r.auth);
40                }
41            }
42        }
43        RegistryCommands::Add => {
44            let name = prompt("Registry name")?;
45            if global.registries.iter().any(|r| r.name == name) {
46                return Err(anyhow!("registry '{}' already exists", name));
47            }
48            let url = prompt("Registry URL")?;
49
50            // Use select menu for auth types
51            let auth_options = vec!["none", "basic", "token", "bearer"];
52            let selection = Select::new()
53                .with_prompt("Auth type")
54                .items(&auth_options)
55                .default(0)
56                .interact()?;
57
58            let auth_type = auth_options[selection];
59            let auth = match auth_type {
60                "none" => AuthConfig::None,
61                "basic" => {
62                    let user = prompt("Username")?;
63                    let pw_env = prompt("Password env var")?;
64                    AuthConfig::Basic {
65                        username: user,
66                        password_env: pw_env,
67                    }
68                }
69                "token" => {
70                    let ev = prompt("Token env var")?;
71                    AuthConfig::Token { token_env: ev }
72                }
73                "bearer" => {
74                    let ev = prompt("Bearer-token env var")?;
75                    AuthConfig::Bearer { token_env: ev }
76                }
77                other => return Err(anyhow!("unknown auth type '{}'", other)),
78            };
79            global.registries.push(RegistryConfig {
80                name: name.clone(),
81                url,
82                auth,
83            });
84            save_global_config(&global)?;
85            println!("✅ Added registry '{name}' successfully");
86        }
87        RegistryCommands::Remove { name } => {
88            let before = global.registries.len();
89            global.registries.retain(|r| r.name != name);
90            if global.registries.len() == before {
91                println!("no such registry '{name}'");
92            } else {
93                save_global_config(&global)?;
94                println!("removed '{name}'");
95            }
96        }
97    }
98
99    Ok(())
100}