use crate::v2::{generated, Require};
use concordium_base::{
common::{cbor, cbor::CborSerializationResult},
protocol_level_tokens::{RawCbor, TokenAmount, TokenId, TokenModuleRef, TokenModuleState},
};
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct TokenInfo {
pub token_id: TokenId,
pub token_state: TokenState,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct TokenState {
pub token_module_ref: TokenModuleRef,
pub decimals: u8,
pub total_supply: TokenAmount,
pub module_state: RawCbor,
}
impl TokenState {
pub fn decode_module_state(&self) -> CborSerializationResult<TokenModuleState> {
cbor::cbor_decode(&self.module_state)
}
}
impl TryFrom<generated::TokenInfo> for TokenInfo {
type Error = tonic::Status;
fn try_from(value: generated::TokenInfo) -> Result<Self, Self::Error> {
Ok(Self {
token_id: value.token_id.require()?.try_into()?,
token_state: value.token_state.require()?.try_into()?,
})
}
}
impl TryFrom<generated::plt::TokenState> for TokenState {
type Error = tonic::Status;
fn try_from(value: generated::plt::TokenState) -> Result<Self, Self::Error> {
Ok(Self {
token_module_ref: value.token_module_ref.require()?.try_into()?,
decimals: value
.decimals
.try_into()
.map_err(|_| tonic::Status::internal("Unexpected token decimals"))?,
total_supply: value.total_supply.require()?.try_into()?,
module_state: value.module_state.require()?.into(),
})
}
}