use crate::{App, result::Result};
use clap::Parser;
use gclient::{
GearApi,
ext::{
sp_core::{Pair as PairT, crypto::Ss58Codec, sr25519::Pair},
sp_runtime::AccountId32,
},
gear::runtime_types::gear_common::storage::primitives::Interval,
};
use gear_core::message::UserStoredMessage;
use std::fmt;
#[derive(Clone, Debug, Parser)]
pub enum Action {
Balance,
Mailbox {
#[arg(default_value = "10", short, long)]
count: usize,
},
}
#[derive(Clone, Debug, Parser)]
pub struct Info {
pub address: Option<String>,
#[command(subcommand)]
pub action: Action,
}
impl Info {
pub async fn exec(&self, app: &impl App) -> Result<()> {
let api = app.api().await?;
let mut address = self.address.clone().unwrap_or_else(|| app.ss58_address());
if address.starts_with("//") {
address = Pair::from_string(&address, None)
.expect("Parse development address failed")
.public()
.to_ss58check()
}
let acc = AccountId32::from_ss58check(&address)?;
match self.action {
Action::Balance => Self::balance(api, acc).await,
Action::Mailbox { count } => Self::mailbox(api, acc, count).await,
}
}
pub async fn balance(signer: GearApi, acc: AccountId32) -> Result<()> {
let info = signer.free_balance(acc).await?;
println!("Free balance: {info:#?}");
Ok(())
}
pub async fn mailbox(signer: GearApi, acc: AccountId32, count: usize) -> Result<()> {
let mails = signer.get_mailbox_account_messages(acc, count).await?;
for t in mails.into_iter() {
println!("{:#?}", Mail::from(t));
}
Ok(())
}
}
pub(crate) struct Mail {
message: UserStoredMessage,
interval: Interval<u32>,
}
impl From<(UserStoredMessage, Interval<u32>)> for Mail {
fn from(t: (UserStoredMessage, Interval<u32>)) -> Self {
Self {
message: t.0,
interval: t.1,
}
}
}
impl fmt::Debug for Mail {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
fmt.debug_struct("Mail")
.field(
"id",
&["0x", &hex::encode(self.message.id().into_bytes())].concat(),
)
.field(
"source",
&["0x", &hex::encode(self.message.source().into_bytes())].concat(),
)
.field(
"destination",
&["0x", &hex::encode(self.message.destination().into_bytes())].concat(),
)
.field(
"payload",
&["0x", &hex::encode(self.message.payload_bytes())].concat(),
)
.field("value", &self.message.value())
.field("interval", &self.interval)
.finish()
}
}