use crate::{common::result::MotokoResult, types::NftStorage};
use super::types::*;
pub type ExtMetadataResult = MotokoResult<ExtTokenMetadata, ExtCommonError>;
pub type ExtSupplyResult = MotokoResult<ExtBalance, ExtCommonError>;
pub trait ExtCommon {
fn metadata(&self, token: ExtTokenIdentifier) -> ExtMetadataResult;
fn supply(&self, _token: ExtTokenIdentifier) -> ExtSupplyResult;
}
impl ExtCommon for NftStorage {
fn metadata(&self, token: ExtTokenIdentifier) -> ExtMetadataResult {
let index = match super::utils::parse_token_index_with_self_canister(&token) {
Ok(index) => index as usize,
Err(e) => return MotokoResult::Err(e),
};
match self.nfts.get(index) {
Some(nft) => {
return MotokoResult::Ok(ExtTokenMetadata::nonfungible {
metadata: nft.content.clone(),
})
}
None => return MotokoResult::Err(ExtCommonError::InvalidToken(token)), }
}
fn supply(&self, _token: ExtTokenIdentifier) -> ExtSupplyResult {
MotokoResult::Ok(candid::Nat::from(self.nfts.len()))
}
}