apicurio_cli/commands/
registry.rs1use 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,
11 Add,
13 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 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}