teasel 0.14.0

Lightweight CLI utilities for inspecting Miden files, local stores, and RPC endpoints
use anyhow::Result;
use miden_client::{
    account::AccountId,
    address::NetworkId,
    rpc::{Endpoint, GrpcClient, NodeRpcClient},
};
use tokio::runtime::Runtime;

use crate::render::account::render_account;
use crate::util::net::DEFAULT_TIMEOUT_MS;

/// Fetch and display account details for an on-chain account id or bech32 address.
pub(crate) fn inspect_account(
    account_id: AccountId,
    address_network_hint: Option<NetworkId>,
    selected_network_id: Option<NetworkId>,
    verbose: bool,
    endpoint: Endpoint,
) -> Result<()> {
    let rt = Runtime::new()?;

    rt.block_on(async move {
        let rpc = GrpcClient::new(&endpoint, DEFAULT_TIMEOUT_MS);
        match rpc.get_account_details(account_id).await {
            Ok(fetched) => {
                println!("Account {account_id}:");
                if let Some(address_network) = address_network_hint {
                    if let Some(expected) = selected_network_id {
                        if expected != address_network {
                            println!(
                                "- warning: address network {address_network} does not match selected {expected}"
                            );
                        } else {
                            println!("- address network: {address_network}");
                        }
                    } else {
                        println!("- address network: {address_network}");
                    }
                }
                println!("- commitment: {}", fetched.commitment());

                match fetched {
                    miden_client::rpc::domain::account::FetchedAccount::Private(_, summary) => {
                        println!("- latest block: {}", summary.last_block_num);
                        if verbose {
                            println!("- type: private (state not available)");
                        } else {
                            println!("- header unavailable (private account)");
                        }
                    },
                    miden_client::rpc::domain::account::FetchedAccount::Public(account, summary) => {
                        println!("- latest block: {}", summary.last_block_num);
                        render_account(account.as_ref(), verbose);
                    },
                }
            },
            Err(err) => {
                println!("Failed to fetch account {account_id}: {err}");
            },
        }
        Ok(())
    })
}