use crate::{identity::UserId, types::NftStorage};
use super::types::*;
pub trait ExtState {
fn get_registry(&self) -> Vec<(ExtTokenIndex, ExtAccountIdentifierHex)>;
fn get_allowances(&self) -> Vec<(ExtTokenIndex, UserId)>;
fn get_metadata(&self) -> Vec<(ExtTokenIndex, ExtTokenMetadata)>;
fn get_tokens(&self) -> Vec<(ExtTokenIndex, ExtTokenMetadata)>;
fn get_tokens_by_ids(
&self,
token_ids: Vec<ExtTokenIndex>,
) -> Vec<(ExtTokenIndex, ExtTokenMetadata)>;
}
impl ExtState for NftStorage {
fn get_registry(&self) -> Vec<(ExtTokenIndex, ExtAccountIdentifierHex)> {
self.nfts
.iter()
.map(|n| (n.index as u32, ExtUser::to_hex(&n.owner.to_vec())))
.collect()
}
fn get_allowances(&self) -> Vec<(ExtTokenIndex, UserId)> {
#[allow::clippy(unwrap_used)] self.nfts
.iter()
.filter(|n| n.approved.is_some())
.map(|n| (n.index as u32, n.approved.unwrap().clone()))
.collect()
}
fn get_metadata(&self) -> Vec<(ExtTokenIndex, ExtTokenMetadata)> {
self.nfts
.iter()
.filter(|n| n.approved.is_some())
.map(|n| {
(
n.index as u32,
ExtTokenMetadata::nonfungible {
metadata: n.content.clone(),
},
)
})
.collect()
}
fn get_tokens(&self) -> Vec<(ExtTokenIndex, ExtTokenMetadata)> {
self.nfts
.iter()
.map(|n| {
(
n.index as u32,
ExtTokenMetadata::nonfungible {
metadata: n.content.clone(), },
)
})
.collect()
}
fn get_tokens_by_ids(
&self,
token_ids: Vec<ExtTokenIndex>,
) -> Vec<(ExtTokenIndex, ExtTokenMetadata)> {
#[allow::clippy(unwrap_used)] token_ids
.iter()
.map(|_id| match self.nfts.get(*_id as usize) {
Some(n) => Some((
*_id,
ExtTokenMetadata::nonfungible {
metadata: n.content.clone(),
},
)),
None => None, })
.filter(|r: &Option<(u32, ExtTokenMetadata)>| r.is_some())
.map(|r| r.unwrap())
.collect()
}
}