use crate::v2::{generated, Require};
use concordium_base::{
common::{cbor, cbor::CborSerializationResult},
protocol_level_tokens::{RawCbor, TokenAmount, TokenId, TokenModuleAccountState},
};
#[cfg_attr(
feature = "serde_deprecated",
derive(serde::Serialize, serde::Deserialize)
)]
#[derive(Debug, PartialEq, Clone)]
#[cfg_attr(feature = "serde_deprecated", serde(rename_all = "camelCase"))]
pub struct AccountToken {
pub token_id: TokenId,
pub state: TokenAccountState,
}
#[cfg_attr(
feature = "serde_deprecated",
derive(serde::Serialize, serde::Deserialize)
)]
#[derive(Debug, PartialEq, Clone)]
#[cfg_attr(feature = "serde_deprecated", serde(rename_all = "camelCase"))]
pub struct TokenAccountState {
pub balance: TokenAmount,
pub module_state: Option<RawCbor>,
}
impl TryFrom<generated::account_info::Token> for AccountToken {
type Error = tonic::Status;
fn try_from(value: generated::account_info::Token) -> Result<Self, Self::Error> {
Ok(Self {
token_id: value.token_id.require()?.try_into()?,
state: value.token_account_state.require()?.try_into()?,
})
}
}
impl TryFrom<generated::plt::TokenAccountState> for TokenAccountState {
type Error = tonic::Status;
fn try_from(value: generated::plt::TokenAccountState) -> Result<Self, Self::Error> {
Ok(Self {
balance: value.balance.require()?.try_into()?,
module_state: value.module_state.map(RawCbor::from),
})
}
}
impl TokenAccountState {
pub fn decode_module_state(&self) -> CborSerializationResult<TokenModuleAccountState> {
match &self.module_state {
Some(cbor) => cbor::cbor_decode(cbor),
None => Ok(TokenModuleAccountState::default()),
}
}
}