proto_cli 0.58.0

A multi-language version manager, a unified toolchain.
use crate::session::{ProtoSession, SessionResult};
use clap::Args;
use proto_core::{PinLocation, ProtoConfig, ToolContext};
use starbase_console::ui::*;
use starbase_styles::encode_style_tags;
use tracing::instrument;

#[derive(Args, Clone, Debug)]
pub struct UnaliasArgs {
    #[arg(required = true, help = "Tool to unalias")]
    context: ToolContext,

    #[arg(required = true, help = "Alias name")]
    alias: String,

    #[arg(long, default_value_t, help = "Location of .prototools to remove from")]
    from: PinLocation,
}

#[instrument(skip(session))]
pub async fn unalias(session: ProtoSession, args: UnaliasArgs) -> SessionResult {
    let tool = session.load_tool(&args.context).await?;
    let mut value = None;

    let config_path = ProtoConfig::update_document(tool.proto.get_config_dir(args.from), |doc| {
        if let Some(tools) = doc.get_mut("tools").and_then(|item| item.as_table_mut()) {
            if let Some(record) = tools
                .get_mut(tool.context.as_str())
                .and_then(|item| item.as_table_mut())
            {
                if let Some(aliases) = record
                    .get_mut("aliases")
                    .and_then(|item| item.as_table_mut())
                {
                    value = aliases.remove(&args.alias);

                    if aliases.is_empty() {
                        record.remove("aliases");
                    }
                }

                if record.is_empty() {
                    tools.remove(tool.context.as_str());
                }
            }

            if tools.is_empty() {
                doc.as_table_mut().remove("tools");
            }
        }
    })?;

    let Some(value) = value else {
        session.console.notice(
            Variant::Caution,
            format!(
                "Alias <id>{}</id> for <id>{}</id> not found in config <path>{}</path>",
                args.alias,
                args.context,
                config_path.display()
            ),
        )?;

        return Ok(Some(1));
    };

    session.console.notice(
        Variant::Success,
        format!(
            "Removed <id>{}</id> alias <id>{}</id> <mutedlight>(with specification <versionalt>{}</versionalt>)</mutedlight> from config <path>{}</path>",
            args.context,
            args.alias,
            encode_style_tags(value.to_string()),
            config_path.display()
        ),
    )?;

    Ok(None)
}