1use codec::{Decode, Encode, MaxEncodedLen};2use scale_info::TypeInfo;34use derivative::Derivative;56#[cfg(feature = "std")]7use serde::Serialize;89use primitives::*;1011pub mod primitives {12 pub type CollectionId = u32;13 pub type ResourceId = u32;14 pub type NftId = u32;15 pub type BaseId = u32;16 pub type SlotId = u32;17 pub type PartId = u32;18 pub type ZIndex = u32;19}2021#[cfg(feature = "std")]22mod serialize {23 use core::convert::AsRef;24 use serde::ser::{self, Serialize};2526 pub mod vec {27 use super::*;2829 pub fn serialize<D, V, C>(value: &C, serializer: D) -> Result<D::Ok, D::Error>30 where31 D: ser::Serializer,32 V: Serialize,33 C: AsRef<[V]>,34 {35 value.as_ref().serialize(serializer)36 }37 }3839 pub mod opt_vec {40 use super::*;4142 pub fn serialize<D, V, C>(value: &Option<C>, serializer: D) -> Result<D::Ok, D::Error>43 where44 D: ser::Serializer,45 V: Serialize,46 C: AsRef<[V]>,47 {48 match value {49 Some(value) => super::vec::serialize(value, serializer),50 None => serializer.serialize_none(),51 }52 }53 }54}555657#[cfg_attr(feature = "std", derive(PartialEq, Eq, Serialize))]58#[derive(Encode, Decode, Debug, TypeInfo, MaxEncodedLen)]59#[cfg_attr(60 feature = "std",61 serde(bound = r#"62 AccountId: Serialize,63 BoundedString: AsRef<[u8]>,64 BoundedSymbol: AsRef<[u8]>65 "#)66)]67pub struct CollectionInfo<BoundedString, BoundedSymbol, AccountId> {68 69 pub issuer: AccountId,7071 #[cfg_attr(feature = "std", serde(with = "serialize::vec"))]72 pub metadata: BoundedString,73 pub max: Option<u32>,7475 #[cfg_attr(feature = "std", serde(with = "serialize::vec"))]76 pub symbol: BoundedSymbol,77 pub nfts_count: u32,78}7980#[derive(Encode, Decode, Eq, PartialEq, Copy, Clone, Debug, TypeInfo, MaxEncodedLen)]81#[cfg_attr(feature = "std", derive(Serialize))]82pub enum AccountIdOrCollectionNftTuple<AccountId> {83 AccountId(AccountId),84 CollectionAndNftTuple(CollectionId, NftId),85}868788#[cfg_attr(feature = "std", derive(PartialEq, Eq, Serialize))]89#[derive(Encode, Decode, Debug, TypeInfo, MaxEncodedLen)]90pub struct RoyaltyInfo<AccountId, RoyaltyAmount> {91 92 pub recipient: AccountId,93 94 pub amount: RoyaltyAmount,95}969798#[cfg_attr(feature = "std", derive(PartialEq, Eq, Serialize))]99#[derive(Encode, Decode, Debug, TypeInfo, MaxEncodedLen)]100#[cfg_attr(101 feature = "std",102 serde(bound = r#"103 AccountId: Serialize,104 RoyaltyAmount: Serialize,105 BoundedString: AsRef<[u8]>106 "#)107)]108pub struct NftInfo<AccountId, RoyaltyAmount, BoundedString> {109 110 pub owner: AccountIdOrCollectionNftTuple<AccountId>,111 112 pub royalty: Option<RoyaltyInfo<AccountId, RoyaltyAmount>>,113114 115 #[cfg_attr(feature = "std", serde(with = "serialize::vec"))]116 pub metadata: BoundedString,117118 119 pub equipped: bool,120 121 pub pending: bool,122}123124#[cfg_attr(feature = "std", derive(PartialEq, Eq, Serialize))]125#[derive(Encode, Decode, TypeInfo, MaxEncodedLen)]126pub struct NftChild {127 pub collection_id: CollectionId,128 pub nft_id: NftId,129}130131#[cfg_attr(feature = "std", derive(Serialize))]132#[derive(Encode, Decode, PartialEq, TypeInfo)]133#[cfg_attr(134 feature = "std",135 serde(bound = r#"136 BoundedKey: AsRef<[u8]>,137 BoundedValue: AsRef<[u8]>138 "#)139)]140pub struct PropertyInfo<BoundedKey, BoundedValue> {141 142 #[cfg_attr(feature = "std", serde(with = "serialize::vec"))]143 pub key: BoundedKey,144145 146 #[cfg_attr(feature = "std", serde(with = "serialize::vec"))]147 pub value: BoundedValue,148}149150#[derive(Encode, Decode, Default, Eq, PartialEq, Clone, Debug, TypeInfo, MaxEncodedLen)]151#[cfg_attr(feature = "std", derive(Serialize))]152#[cfg_attr(feature = "std", serde(bound = "BoundedString: AsRef<[u8]>"))]153pub struct BasicResource<BoundedString> {154 155 156 #[cfg_attr(feature = "std", serde(with = "serialize::opt_vec"))]157 pub src: Option<BoundedString>,158159 160 #[cfg_attr(feature = "std", serde(with = "serialize::opt_vec"))]161 pub metadata: Option<BoundedString>,162163 164 #[cfg_attr(feature = "std", serde(with = "serialize::opt_vec"))]165 pub license: Option<BoundedString>,166167 168 169 170 171 172 173 #[cfg_attr(feature = "std", serde(with = "serialize::opt_vec"))]174 pub thumb: Option<BoundedString>,175}176177#[derive(Encode, Decode, Eq, PartialEq, Clone, Debug, TypeInfo, MaxEncodedLen)]178#[cfg_attr(feature = "std", derive(Serialize))]179#[cfg_attr(180 feature = "std",181 serde(bound = r#"182 BoundedString: AsRef<[u8]>,183 BoundedParts: AsRef<[PartId]>184 "#)185)]186pub struct ComposableResource<BoundedString, BoundedParts> {187 188 #[cfg_attr(feature = "std", serde(with = "serialize::vec"))]189 pub parts: BoundedParts,190191 192 193 194 pub base: BaseId,195196 197 198 #[cfg_attr(feature = "std", serde(with = "serialize::opt_vec"))]199 pub src: Option<BoundedString>,200201 202 #[cfg_attr(feature = "std", serde(with = "serialize::opt_vec"))]203 pub metadata: Option<BoundedString>,204205 206 207 208 209210 211 #[cfg_attr(feature = "std", serde(with = "serialize::opt_vec"))]212 pub license: Option<BoundedString>,213214 215 216 217 218 219 220 #[cfg_attr(feature = "std", serde(with = "serialize::opt_vec"))]221 pub thumb: Option<BoundedString>,222}223224#[derive(Encode, Decode, Eq, PartialEq, Clone, Debug, TypeInfo, MaxEncodedLen)]225#[cfg_attr(feature = "std", derive(Serialize))]226#[cfg_attr(feature = "std", serde(bound = "BoundedString: AsRef<[u8]>"))]227pub struct SlotResource<BoundedString> {228 229 230 231 pub base: BaseId,232233 234 235 #[cfg_attr(feature = "std", serde(with = "serialize::opt_vec"))]236 pub src: Option<BoundedString>,237238 239 #[cfg_attr(feature = "std", serde(with = "serialize::opt_vec"))]240 pub metadata: Option<BoundedString>,241242 243 244 245 246 pub slot: SlotId,247248 249 250 #[cfg_attr(feature = "std", serde(with = "serialize::opt_vec"))]251 pub license: Option<BoundedString>,252253 254 255 256 257 258 259 #[cfg_attr(feature = "std", serde(with = "serialize::opt_vec"))]260 pub thumb: Option<BoundedString>,261}262263#[derive(Encode, Decode, Derivative, Eq, PartialEq, Clone, Debug, TypeInfo, MaxEncodedLen)]264#[cfg_attr(feature = "std", derive(Serialize))]265#[cfg_attr(266 feature = "std",267 serde(bound = r#"268 BoundedString: AsRef<[u8]>,269 BoundedParts: AsRef<[PartId]>270 "#)271)]272#[derivative(Default(bound = ""))]273pub enum ResourceTypes<BoundedString: Default, BoundedParts> {274 #[derivative(Default)]275 Basic(BasicResource<BoundedString>),276 Composable(ComposableResource<BoundedString, BoundedParts>),277 Slot(SlotResource<BoundedString>),278}279280#[derive(Encode, Decode, Eq, PartialEq, Clone, Debug, TypeInfo, MaxEncodedLen)]281#[cfg_attr(feature = "std", derive(Serialize))]282#[cfg_attr(283 feature = "std",284 serde(bound = r#"285 BoundedResource: AsRef<[u8]>,286 BoundedString: AsRef<[u8]>,287 BoundedParts: AsRef<[PartId]>288 "#)289)]290pub struct ResourceInfo<BoundedResource, BoundedString: Default, BoundedParts> {291 292 293 294 #[cfg_attr(feature = "std", serde(with = "serialize::vec"))]295 pub id: BoundedResource,296297 298 pub resource: ResourceTypes<BoundedString, BoundedParts>,299300 301 pub pending: bool,302303 304 pub pending_removal: bool,305}306307#[cfg_attr(feature = "std", derive(PartialEq, Eq, Serialize))]308#[derive(Encode, Decode, Debug, TypeInfo, MaxEncodedLen)]309#[cfg_attr(310 feature = "std",311 serde(bound = r#"312 AccountId: Serialize,313 BoundedString: AsRef<[u8]>314 "#)315)]316pub struct BaseInfo<AccountId, BoundedString> {317 318 pub issuer: AccountId,319320 321 #[cfg_attr(feature = "std", serde(with = "serialize::vec"))]322 pub base_type: BoundedString,323324 325 #[cfg_attr(feature = "std", serde(with = "serialize::vec"))]326 pub symbol: BoundedString,327}328329#[cfg_attr(feature = "std", derive(Serialize))]330#[derive(Encode, Decode, Debug, TypeInfo, Clone, PartialEq, Eq, MaxEncodedLen)]331#[cfg_attr(feature = "std", serde(bound = "BoundedString: AsRef<[u8]>"))]332pub struct FixedPart<BoundedString> {333 pub id: PartId,334 pub z: ZIndex,335336 #[cfg_attr(feature = "std", serde(with = "serialize::vec"))]337 pub src: BoundedString,338}339340#[cfg_attr(feature = "std", derive(Serialize))]341#[derive(Encode, Decode, Debug, Derivative, TypeInfo, Clone, PartialEq, Eq, MaxEncodedLen)]342#[cfg_attr(343 feature = "std",344 serde(bound = "BoundedCollectionList: AsRef<[CollectionId]>")345)]346#[derivative(Default(bound = ""))]347pub enum EquippableList<BoundedCollectionList> {348 All,349350 #[derivative(Default)]351 Empty,352353 Custom(#[cfg_attr(feature = "std", serde(with = "serialize::vec"))] BoundedCollectionList),354}355356#[cfg_attr(feature = "std", derive(Serialize))]357#[derive(Encode, Decode, Debug, TypeInfo, Clone, PartialEq, Eq, MaxEncodedLen)]358#[cfg_attr(359 feature = "std",360 serde(bound = r#"361 BoundedString: AsRef<[u8]>,362 BoundedCollectionList: AsRef<[CollectionId]>363 "#)364)]365pub struct SlotPart<BoundedString, BoundedCollectionList> {366 pub id: PartId,367 pub equippable: EquippableList<BoundedCollectionList>,368369 #[cfg_attr(feature = "std", serde(with = "serialize::vec"))]370 pub src: BoundedString,371372 pub z: ZIndex,373}374375#[cfg_attr(feature = "std", derive(Serialize))]376#[derive(Encode, Decode, Debug, TypeInfo, Clone, PartialEq, Eq, MaxEncodedLen)]377#[cfg_attr(378 feature = "std",379 serde(bound = r#"380 BoundedString: AsRef<[u8]>,381 BoundedCollectionList: AsRef<[CollectionId]>382 "#)383)]384pub enum PartType<BoundedString, BoundedCollectionList> {385 FixedPart(FixedPart<BoundedString>),386 SlotPart(SlotPart<BoundedString, BoundedCollectionList>),387}388389impl<BoundedString, BoundedCollectionList> PartType<BoundedString, BoundedCollectionList> {390 pub fn id(&self) -> PartId {391 match self {392 Self::FixedPart(part) => part.id,393 Self::SlotPart(part) => part.id,394 }395 }396397 pub fn src(&self) -> &BoundedString {398 match self {399 Self::FixedPart(part) => &part.src,400 Self::SlotPart(part) => &part.src,401 }402 }403404 pub fn z_index(&self) -> ZIndex {405 match self {406 Self::FixedPart(part) => part.z,407 Self::SlotPart(part) => part.z,408 }409 }410}411412#[cfg_attr(feature = "std", derive(Eq, Serialize))]413#[derive(Encode, Decode, Debug, TypeInfo, Clone, PartialEq)]414#[cfg_attr(415 feature = "std",416 serde(bound = r#"417 BoundedString: AsRef<[u8]>,418 PropertyList: AsRef<[ThemeProperty<BoundedString>]>,419 "#)420)]421pub struct Theme<BoundedString, PropertyList> {422 423 #[cfg_attr(feature = "std", serde(with = "serialize::vec"))]424 pub name: BoundedString,425426 427 #[cfg_attr(feature = "std", serde(with = "serialize::vec"))]428 pub properties: PropertyList,429 430 pub inherit: bool,431}432433#[cfg_attr(feature = "std", derive(Eq, Serialize))]434#[derive(Encode, Decode, Debug, TypeInfo, Clone, PartialEq)]435#[cfg_attr(feature = "std", serde(bound = "BoundedString: AsRef<[u8]>"))]436pub struct ThemeProperty<BoundedString> {437 438 #[cfg_attr(feature = "std", serde(with = "serialize::vec"))]439 pub key: BoundedString,440441 442 #[cfg_attr(feature = "std", serde(with = "serialize::vec"))]443 pub value: BoundedString,444}