cloud_terrastodon_entrypoint 0.35.0

Main entrypoint for the Cloud Terrastodon CLI
use cloud_terrastodon_azure::AzureTenantId;
use cloud_terrastodon_azure::PolicyDefinition;
use cloud_terrastodon_azure::Scope;
use cloud_terrastodon_azure::fetch_all_policy_definitions;
use cloud_terrastodon_user_input::Choice;
use cloud_terrastodon_user_input::PickerTui;
use itertools::Itertools;
use tracing::info;

pub async fn browse_policy_definitions(tenant_id: AzureTenantId) -> eyre::Result<()> {
    let policy_definitions = fetch_all_policy_definitions(tenant_id)
        .await?
        .into_iter()
        .map(|def| Choice {
            key: match def.description.as_ref() {
                Some(desc) => format!("{def} - {desc}"),
                None => format!("{def} - no description"),
            },
            value: def,
        });
    let chosen: Vec<PolicyDefinition> = PickerTui::new().pick_many(policy_definitions)?;
    let msg = format!(
        "You chose:\n{}",
        chosen
            .iter()
            .map(|x| format!("- {}", x.id.expanded_form()))
            .join("\n")
    );
    info!("{msg}");

    Ok(())
}