diff --git a/gql/gva_queries.gql b/gql/gva_queries.gql index 52d8aba3d81698e18161e06f0c87726a29fd6226..f68ac66a8bdb62d756fd5bd4c5adf7a2230d6cb8 100644 --- a/gql/gva_queries.gql +++ b/gql/gva_queries.gql @@ -12,3 +12,9 @@ query CurrentUd { amount } } + +query MembersCount { + currentBlock { + membersCount + } +} diff --git a/src/commands.rs b/src/commands.rs index ab1dfd4f5c4227a8b3f2217c68d8699ea562d80b..f734346eb74f8003d86a83fd61fa185096200bb2 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -25,6 +25,8 @@ pub(crate) enum Command { }, /// Get current UD value CurrentUd, + /// Get current number of WoT members + MembersCount, } pub(crate) fn balance<W: Write>( @@ -83,6 +85,24 @@ pub(crate) fn current_ud<W: Write>(client: &Client, out: &mut W) -> anyhow::Resu Ok(()) } +pub(crate) fn members_count<W: Write>(client: &Client, out: &mut W) -> anyhow::Result<()> { + let request_body = MembersCount::build_query(members_count::Variables); + + let members_count::ResponseData { + current_block: members_count::MembersCountCurrentBlock { members_count }, + } = client.send_gql_query(&request_body)?; + + writeln!( + out, + "There is currently {} members in Ğ1 WoT!", + members_count + )?; + + Ok(()) +} + +// below are tests + #[cfg(test)] mod tests { use super::*; @@ -145,4 +165,25 @@ mod tests { Ok(()) } + + #[test] + fn test_member_count() -> anyhow::Result<()> { + let mut client = Client::default(); + client + .expect_send_gql_query::<graphql_client::QueryBody<members_count::Variables>, _>() + .returning(|_| { + Ok(members_count::ResponseData { + current_block: members_count::MembersCountCurrentBlock { + members_count: 10_000, + }, + }) + }); + let mut out = Vec::new(); + members_count(&client, &mut out)?; + let output = std::str::from_utf8(&out)?; + + assert_eq!(output, "There is currently 10000 members in Ğ1 WoT!\n"); + + Ok(()) + } } diff --git a/src/main.rs b/src/main.rs index 4b7e8e9757b9cbe0b871c0e6d1d5962f6801384f..e23963da15744d7c5e4bb6b1dccb43aad3c555c6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -32,7 +32,7 @@ use crate::client::Client; #[cfg(test)] use crate::client::MockClient as Client; use crate::commands::Command; -use commands::{balance, current_ud}; +use commands::{balance, current_ud, members_count}; use graphql_client::GraphQLQuery; use graphql_client::Response; use std::io::Write; @@ -49,6 +49,10 @@ pub struct Balance; #[graphql(schema_path = "gql/gva_schema.gql", query_path = "gql/gva_queries.gql")] pub struct CurrentUd; +#[derive(Debug, Clone, Copy, GraphQLQuery)] +#[graphql(schema_path = "gql/gva_schema.gql", query_path = "gql/gva_queries.gql")] +pub struct MembersCount; + #[derive(StructOpt)] #[structopt(name = "rust-gva-client", about = "Client use GVA API of Duniter.")] struct CliArgs { @@ -71,6 +75,7 @@ fn main() -> anyhow::Result<()> { ud_unit, } => balance(&client, &mut out, &pubkey_or_script, ud_unit)?, Command::CurrentUd => current_ud(&client, &mut out)?, + Command::MembersCount => members_count(&client, &mut out)?, } Ok(()) }