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(62 bound = r#"63 AccountId: Serialize,64 BoundedString: AsRef<[u8]>,65 BoundedSymbol: AsRef<[u8]>66 "#67 )68)]69pub struct CollectionInfo<BoundedString, BoundedSymbol, AccountId> {70 71 pub issuer: AccountId,7273 #[cfg_attr(feature = "std", serde(with = "serialize::vec"))]74 pub metadata: BoundedString,75 pub max: Option<u32>,7677 #[cfg_attr(feature = "std", serde(with = "serialize::vec"))]78 pub symbol: BoundedSymbol,79 pub nfts_count: u32,80}8182#[derive(Encode, Decode, Eq, PartialEq, Copy, Clone, Debug, TypeInfo, MaxEncodedLen)]83#[cfg_attr(feature = "std", derive(Serialize))]84pub enum AccountIdOrCollectionNftTuple<AccountId> {85 AccountId(AccountId),86 CollectionAndNftTuple(CollectionId, NftId),87}888990#[cfg_attr(feature = "std", derive(PartialEq, Eq, Serialize))]91#[derive(Encode, Decode, Debug, TypeInfo, MaxEncodedLen)]92pub struct RoyaltyInfo<AccountId, RoyaltyAmount> {93 94 pub recipient: AccountId,95 96 pub amount: RoyaltyAmount,97}9899100#[cfg_attr(feature = "std", derive(PartialEq, Eq, Serialize))]101#[derive(Encode, Decode, Debug, TypeInfo, MaxEncodedLen)]102#[cfg_attr(103 feature = "std",104 serde(105 bound = r#"106 AccountId: Serialize,107 RoyaltyAmount: Serialize,108 BoundedString: AsRef<[u8]>109 "#110 )111)]112pub struct NftInfo<AccountId, RoyaltyAmount, BoundedString> {113 114 pub owner: AccountIdOrCollectionNftTuple<AccountId>,115 116 pub royalty: Option<RoyaltyInfo<AccountId, RoyaltyAmount>>,117118 119 #[cfg_attr(feature = "std", serde(with = "serialize::vec"))]120 pub metadata: BoundedString,121122 123 pub equipped: bool,124 125 pub pending: bool,126}127128#[cfg_attr(feature = "std", derive(PartialEq, Eq, Serialize))]129#[derive(Encode, Decode, TypeInfo, MaxEncodedLen)]130pub struct NftChild {131 pub collection_id: CollectionId,132 pub nft_id: NftId133}134135#[cfg_attr(feature = "std", derive(Serialize))]136#[derive(Encode, Decode, PartialEq, TypeInfo)]137#[cfg_attr(138 feature = "std",139 serde(140 bound = r#"141 BoundedKey: AsRef<[u8]>,142 BoundedValue: AsRef<[u8]>143 "#144 )145)]146pub struct PropertyInfo<BoundedKey, BoundedValue>147{148 149 #[cfg_attr(feature = "std", serde(with = "serialize::vec"))]150 pub key: BoundedKey,151152 153 #[cfg_attr(feature = "std", serde(with = "serialize::vec"))]154 pub value: BoundedValue,155}156157#[derive(Encode, Decode, Default, Eq, PartialEq, Clone, Debug, TypeInfo, MaxEncodedLen)]158#[cfg_attr(feature = "std", derive(Serialize))]159#[cfg_attr(160 feature = "std",161 serde(bound = "BoundedString: AsRef<[u8]>")162)]163pub struct BasicResource<BoundedString> {164 165 166 #[cfg_attr(feature = "std", serde(with = "serialize::opt_vec"))]167 pub src: Option<BoundedString>,168169 170 #[cfg_attr(feature = "std", serde(with = "serialize::opt_vec"))]171 pub metadata: Option<BoundedString>,172173 174 #[cfg_attr(feature = "std", serde(with = "serialize::opt_vec"))]175 pub license: Option<BoundedString>,176177 178 179 180 181 182 183 #[cfg_attr(feature = "std", serde(with = "serialize::opt_vec"))]184 pub thumb: Option<BoundedString>,185}186187#[derive(Encode, Decode, Eq, PartialEq, Clone, Debug, TypeInfo, MaxEncodedLen)]188#[cfg_attr(feature = "std", derive(Serialize))]189#[cfg_attr(190 feature = "std",191 serde(192 bound = r#"193 BoundedString: AsRef<[u8]>,194 BoundedParts: AsRef<[PartId]>195 "#196 )197)]198pub struct ComposableResource<BoundedString, BoundedParts> {199 200 #[cfg_attr(feature = "std", serde(with = "serialize::vec"))]201 pub parts: BoundedParts,202203 204 205 206 pub base: BaseId,207208 209 210 #[cfg_attr(feature = "std", serde(with = "serialize::opt_vec"))]211 pub src: Option<BoundedString>,212213 214 #[cfg_attr(feature = "std", serde(with = "serialize::opt_vec"))]215 pub metadata: Option<BoundedString>,216217 218 219 220 221222 223 #[cfg_attr(feature = "std", serde(with = "serialize::opt_vec"))]224 pub license: Option<BoundedString>,225226 227 228 229 230 231 232 #[cfg_attr(feature = "std", serde(with = "serialize::opt_vec"))]233 pub thumb: Option<BoundedString>,234}235236#[derive(Encode, Decode, Eq, PartialEq, Clone, Debug, TypeInfo, MaxEncodedLen)]237#[cfg_attr(feature = "std", derive(Serialize))]238#[cfg_attr(239 feature = "std",240 serde(bound = "BoundedString: AsRef<[u8]>")241)]242pub struct SlotResource<BoundedString> {243 244 245 246 pub base: BaseId,247248 249 250 #[cfg_attr(feature = "std", serde(with = "serialize::opt_vec"))]251 pub src: Option<BoundedString>,252253 254 #[cfg_attr(feature = "std", serde(with = "serialize::opt_vec"))]255 pub metadata: Option<BoundedString>,256257 258 259 260 261 pub slot: SlotId,262263 264 265 #[cfg_attr(feature = "std", serde(with = "serialize::opt_vec"))]266 pub license: Option<BoundedString>,267268 269 270 271 272 273 274 #[cfg_attr(feature = "std", serde(with = "serialize::opt_vec"))]275 pub thumb: Option<BoundedString>,276}277278#[derive(Encode, Decode, Derivative, Eq, PartialEq, Clone, Debug, TypeInfo, MaxEncodedLen)]279#[cfg_attr(feature = "std", derive(Serialize))]280#[cfg_attr(281 feature = "std",282 serde(283 bound = r#"284 BoundedString: AsRef<[u8]>,285 BoundedParts: AsRef<[PartId]>286 "#287 )288)]289#[derivative(Default(bound=""))]290pub enum ResourceTypes<BoundedString: Default, BoundedParts> {291 #[derivative(Default)]292 Basic(BasicResource<BoundedString>),293 Composable(ComposableResource<BoundedString, BoundedParts>),294 Slot(SlotResource<BoundedString>),295}296297298#[derive(Encode, Decode, Eq, PartialEq, Clone, Debug, TypeInfo, MaxEncodedLen)]299#[cfg_attr(feature = "std", derive(Serialize))]300#[cfg_attr(301 feature = "std",302 serde(303 bound = r#"304 BoundedResource: AsRef<[u8]>,305 BoundedString: AsRef<[u8]>,306 BoundedParts: AsRef<[PartId]>307 "#308 )309)]310pub struct ResourceInfo<BoundedResource, BoundedString: Default, BoundedParts> {311 312 313 314 #[cfg_attr(feature = "std", serde(with = "serialize::vec"))]315 pub id: BoundedResource,316317 318 pub resource: ResourceTypes<BoundedString, BoundedParts>,319320 321 pub pending: bool,322323 324 pub pending_removal: bool,325}326327#[cfg_attr(feature = "std", derive(PartialEq, Eq, Serialize))]328#[derive(Encode, Decode, Debug, TypeInfo, MaxEncodedLen)]329#[cfg_attr(330 feature = "std",331 serde(332 bound = r#"333 AccountId: Serialize,334 BoundedString: AsRef<[u8]>335 "#336 )337)]338pub struct BaseInfo<AccountId, BoundedString> {339 340 pub issuer: AccountId,341342 343 #[cfg_attr(feature = "std", serde(with = "serialize::vec"))]344 pub base_type: BoundedString,345346 347 #[cfg_attr(feature = "std", serde(with = "serialize::vec"))]348 pub symbol: BoundedString,349}350351#[cfg_attr(feature = "std", derive(Serialize))]352#[derive(Encode, Decode, Debug, TypeInfo, Clone, PartialEq, Eq, MaxEncodedLen)]353#[cfg_attr(354 feature = "std",355 serde(bound = "BoundedString: AsRef<[u8]>")356)]357pub struct FixedPart<BoundedString> {358 pub id: PartId,359 pub z: ZIndex,360361 #[cfg_attr(feature = "std", serde(with = "serialize::vec"))]362 pub src: BoundedString,363}364365#[cfg_attr(feature = "std", derive(Serialize))]366#[derive(Encode, Decode, Debug, Derivative, TypeInfo, Clone, PartialEq, Eq, MaxEncodedLen)]367#[cfg_attr(368 feature = "std",369 serde(bound = "BoundedCollectionList: AsRef<[CollectionId]>")370)]371#[derivative(Default(bound=""))]372pub enum EquippableList<BoundedCollectionList> {373 All,374375 #[derivative(Default)]376 Empty,377378 Custom(379 #[cfg_attr(feature = "std", serde(with = "serialize::vec"))]380 BoundedCollectionList381 ),382}383384#[cfg_attr(feature = "std", derive(Serialize))]385#[derive(Encode, Decode, Debug, TypeInfo, Clone, PartialEq, Eq, MaxEncodedLen)]386#[cfg_attr(387 feature = "std",388 serde(389 bound = r#"390 BoundedString: AsRef<[u8]>,391 BoundedCollectionList: AsRef<[CollectionId]>392 "#393 )394)]395pub struct SlotPart<BoundedString, BoundedCollectionList> {396 pub id: PartId,397 pub equippable: EquippableList<BoundedCollectionList>,398399 #[cfg_attr(feature = "std", serde(with = "serialize::vec"))]400 pub src: BoundedString,401402 pub z: ZIndex,403}404405#[cfg_attr(feature = "std", derive(Serialize))]406#[derive(Encode, Decode, Debug, TypeInfo, Clone, PartialEq, Eq, MaxEncodedLen)]407#[cfg_attr(408 feature = "std",409 serde(410 bound = r#"411 BoundedString: AsRef<[u8]>,412 BoundedCollectionList: AsRef<[CollectionId]>413 "#414 )415)]416pub enum PartType<BoundedString, BoundedCollectionList> {417 FixedPart(FixedPart<BoundedString>),418 SlotPart(SlotPart<BoundedString, BoundedCollectionList>),419}420421impl<BoundedString, BoundedCollectionList> PartType<BoundedString, BoundedCollectionList> {422 pub fn id(&self) -> PartId {423 match self {424 Self::FixedPart(part) => part.id,425 Self::SlotPart(part) => part.id426 }427 }428429 pub fn src(&self) -> &BoundedString {430 match self {431 Self::FixedPart(part) => &part.src,432 Self::SlotPart(part) => &part.src433 }434 }435436 pub fn z_index(&self) -> ZIndex {437 match self {438 Self::FixedPart(part) => part.z,439 Self::SlotPart(part) => part.z440 }441 }442}443444#[cfg_attr(feature = "std", derive(Eq, Serialize))]445#[derive(Encode, Decode, Debug, TypeInfo, Clone, PartialEq)]446#[cfg_attr(447 feature = "std",448 serde(449 bound = r#"450 BoundedString: AsRef<[u8]>,451 PropertyList: AsRef<[ThemeProperty<BoundedString>]>,452 "#453 )454)]455pub struct Theme<BoundedString, PropertyList> {456 457 #[cfg_attr(feature = "std", serde(with = "serialize::vec"))]458 pub name: BoundedString,459460 461 #[cfg_attr(feature = "std", serde(with = "serialize::vec"))]462 pub properties: PropertyList,463 464 pub inherit: bool,465}466467#[cfg_attr(feature = "std", derive(Eq, Serialize))]468#[derive(Encode, Decode, Debug, TypeInfo, Clone, PartialEq)]469#[cfg_attr(470 feature = "std",471 serde(bound = "BoundedString: AsRef<[u8]>")472)]473pub struct ThemeProperty<BoundedString> {474 475 #[cfg_attr(feature = "std", serde(with = "serialize::vec"))]476 pub key: BoundedString,477478 479 #[cfg_attr(feature = "std", serde(with = "serialize::vec"))]480 pub value: BoundedString,481}