Skip to content
Snippets Groups Projects
collective.rs 2.3 KiB
Newer Older
use crate::{gdev, indexer::*, Args, Client};

use anyhow::Result;

pub async fn technical_committee_members(client: Client, args: &Args) -> Result<()> {
    let parent_hash = client
        .storage()
        .fetch(&gdev::storage().system().parent_hash(), None)
        .await?
        .unwrap();

    let gql_client = reqwest::Client::builder()
        .user_agent("gcli/0.1.0")
        .build()?;

    let indexer = if args.no_indexer {
        None
    } else {
        Some(Indexer {
            gql_client,
            gql_url: &args.indexer,
        })
    };

    for account_id in client
        .storage()
        .fetch(
            &gdev::storage().technical_committee().members(),
            Some(parent_hash),
        )
        .await?
        .unwrap_or_default()
    {
        println!(
            "{}",
            if let Some(indexer) = &indexer {
                indexer
                    .username_by_pubkey(&account_id.to_string())
                    .await
                    .ok()
                    .flatten()
            } else {
                client
                    .storage()
                    .fetch(
                        &gdev::storage().identity().identity_index_of(&account_id),
                        Some(parent_hash),
                    )
                    .await
                    .ok()
                    .flatten()
                    .map(|identity_id| format!("{identity_id}"))
            }
            .unwrap_or_else(|| account_id.to_string(),)
        );
    }

    Ok(())
}

// TODO:
// * better formatting (format pubkeys to SS58 and add usernames)
// * display proposals indices
pub async fn technical_committee_proposals(client: Client) -> Result<()> {
    let parent_hash = client
        .storage()
        .fetch(&gdev::storage().system().parent_hash(), None)
        .await?
        .unwrap();

    let mut proposals_iter = client
        .storage()
        .iter(
            gdev::storage()
                .technical_committee()
                .proposal_of(sp_core::H256::default()),
            10,
            Some(parent_hash),
        )
        .await?;
    while let Some((proposal_hash, proposal)) = proposals_iter.next().await? {
        println!("{}", hex::encode(&proposal_hash.0[32..64]));
        println!("{proposal:#?}");
        println!();
    }

    Ok(())
}