hop-cli 0.2.61

Interact with Hop in your terminal
Documentation
use anyhow::{Context, Result};
use clap::Parser;

use crate::commands::projects::utils::{format_project, format_projects};
use crate::state::State;
use crate::store::Store;

#[derive(Debug, Parser)]
#[clap(about = "Switch to a different project")]
#[group(skip)]
pub struct Options {
    #[clap(help = "Namespace or ID of the project to use")]
    pub project: Option<String>,
}

pub async fn handle(options: Options, mut state: State) -> Result<()> {
    let projects = state.ctx.current.clone().unwrap().projects;

    let project = match options.project.clone() {
        Some(namespace) => state
            .ctx
            .find_project_by_id_or_namespace(&namespace)
            .with_context(|| format!("Project `{namespace}` not found"))?,
        None => {
            let projects_fmt = format_projects(&projects, false);

            let idx = dialoguer::Select::new()
                .with_prompt("Select a project")
                .items(&projects_fmt)
                .default(if let Some(current) = state.ctx.current_project() {
                    projects
                        .iter()
                        .position(|p| p.id == current.id)
                        .unwrap_or(0)
                } else {
                    0
                })
                .interact()?;

            projects[idx].clone()
        }
    };

    state.ctx.default_project = Some(project.id.clone());
    state.ctx.save().await?;

    log::info!("Switched to project {}", format_project(&project));

    Ok(())
}