use hedera_proto::services;
use prost::Message;
use crate::protobuf::ToProtobuf;
use crate::{
AccountId,
FromProtobuf,
Hbar,
Tinybar,
};
#[derive(Debug, Clone)]
#[cfg_attr(feature = "ffi", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "ffi", serde(rename_all = "camelCase"))]
pub struct AccountBalance {
pub account_id: AccountId,
pub hbars: Hbar,
}
impl AccountBalance {
pub fn from_bytes(bytes: &[u8]) -> crate::Result<Self> {
FromProtobuf::<services::CryptoGetAccountBalanceResponse>::from_bytes(bytes)
}
#[must_use]
pub fn to_bytes(&self) -> Vec<u8> {
#[allow(deprecated)]
services::CryptoGetAccountBalanceResponse {
header: None,
account_id: Some(self.account_id.to_protobuf()),
balance: self.hbars.to_tinybars() as u64,
token_balances: Vec::default(),
}
.encode_to_vec()
}
}
impl FromProtobuf<services::CryptoGetAccountBalanceResponse> for AccountBalance {
fn from_protobuf(pb: services::CryptoGetAccountBalanceResponse) -> crate::Result<Self>
where
Self: Sized,
{
let account_id = pb_getf!(pb, account_id)?;
let account_id = AccountId::from_protobuf(account_id)?;
let balance = Hbar::from_tinybars(pb.balance as Tinybar);
Ok(Self { account_id, hbars: balance })
}
}
impl FromProtobuf<services::response::Response> for AccountBalance {
fn from_protobuf(pb: services::response::Response) -> crate::Result<Self> {
let response = pb_getv!(pb, CryptogetAccountBalance, services::response::Response);
Self::from_protobuf(response)
}
}