Skip to main content

cellos_ctl/cmd/
config_cmd.rs

1//! `cellctl config set-server <url>` / `set-token <token>` / `show`.
2
3use crate::config::{self, Config};
4use crate::exit::{CtlError, CtlResult};
5
6pub fn set_server(url: &str) -> CtlResult<()> {
7    // Validate URL shape before persisting — better to fail at config-set time
8    // than confuse the user later with a HTTP error.
9    let parsed = url::Url::parse(url).map_err(|e| CtlError::usage(format!("invalid url: {e}")))?;
10    if !matches!(parsed.scheme(), "http" | "https") {
11        return Err(CtlError::usage(format!(
12            "url scheme must be http or https (got {})",
13            parsed.scheme()
14        )));
15    }
16    let mut cfg = config::load().unwrap_or_default();
17    cfg.server_url = Some(url.to_string());
18    config::save(&cfg)?;
19    println!("server set to {}", url);
20    Ok(())
21}
22
23pub fn set_token(token: &str) -> CtlResult<()> {
24    if token.trim().is_empty() {
25        return Err(CtlError::usage("token cannot be empty"));
26    }
27    let mut cfg = config::load().unwrap_or_default();
28    cfg.api_token = Some(token.to_string());
29    config::save(&cfg)?;
30    println!("token saved to {}", config::config_path()?.display());
31    Ok(())
32}
33
34pub fn show() -> CtlResult<()> {
35    let cfg: Config = config::load().unwrap_or_default();
36    println!("config_path: {}", config::config_path()?.display());
37    println!("server_url:  {}", cfg.effective_server());
38    println!(
39        "api_token:   {}",
40        match cfg.effective_token() {
41            Some(_) => "<set>",
42            None => "<unset>",
43        }
44    );
45    Ok(())
46}