cloud_terrastodon_entrypoint 0.35.0

Main entrypoint for the Cloud Terrastodon CLI
use cloud_terrastodon_azure::AzureTenantId;
use cloud_terrastodon_azure::EntraUserId;
use cloud_terrastodon_azure::fetch_all_entra_users;
use cloud_terrastodon_user_input::prompt_line;
use eyre::Result;
use indexmap::IndexSet;
use std::collections::HashMap;
use tracing::info;

pub async fn bulk_user_id_lookup(tenant_id: AzureTenantId) -> Result<()> {
    info!("Enter the user IDs, one per line. Enter a blank line to proceed.");
    let mut user_ids = IndexSet::new();
    loop {
        let x = prompt_line("Enter user ID: ").await?;
        if x.is_empty() {
            break;
        } else {
            user_ids.insert(x.parse::<EntraUserId>()?);
        }
    }

    let users = fetch_all_entra_users(tenant_id)
        .await?
        .into_iter()
        .filter(|x| user_ids.contains(&x.id))
        .map(|x| (x.id, x))
        .collect::<HashMap<_, _>>();

    // we want to print in the order which the IDs were provided
    for user_id in user_ids {
        let Some(user) = users.get(&user_id) else {
            println!("{user_id} - no user found");
            continue;
        };
        println!("{} - {}", user_id, user.user_principal_name)
    }

    Ok(())
}