aegis-tool 0.3.3

Aegis SSH client and managed host agent.
Documentation
use anyhow::{Result, ensure};

use crate::{
    api::{AuthenticatedApiClient, installed_agent_api_base},
    cli::{NamespaceArgs, NamespaceCommands},
    config::{UserContext, resolve_api_base},
    ui::{self, TaskOptions},
};

pub(super) fn run(api_base_override: Option<&str>, args: &NamespaceArgs) -> Result<i32> {
    let base = resolve_api_base(api_base_override, installed_agent_api_base()?.as_deref())?;
    let endpoint = aegis_dto::namespace::ApiEndpoint::parse(&base).map_err(anyhow::Error::msg)?;
    let endpoint = match &args.command {
        NamespaceCommands::Use { namespace } => endpoint.with_namespace(namespace.clone()),
        NamespaceCommands::Show => endpoint,
    };
    let task = ui::task(TaskOptions {
        label: "Checking namespace membership".into(),
        ..TaskOptions::default()
    })?;
    let mut api = AuthenticatedApiClient::load(Some(&endpoint.base_url()))?;
    let context = api.namespace_context()?;
    ensure!(
        Some(&context.namespace) == endpoint.namespace(),
        "API returned a different namespace"
    );
    if matches!(args.command, NamespaceCommands::Use { .. }) {
        UserContext {
            api_base: endpoint.base_url(),
        }
        .persist()?;
        task.finish("Namespace selection saved");
    } else {
        task.finish_and_clear();
    }
    println!(
        "{}",
        serde_json::to_string_pretty(&serde_json::json!({
            "api_base": endpoint.base_url(), "namespace": context.namespace, "role": context.role,
        }))?
    );
    Ok(0)
}