open_edition_factory/
types.rs

1use cosmwasm_schema::cw_serde;
2use cosmwasm_std::ensure;
3
4use sg_metadata::Metadata;
5
6use crate::ContractError;
7
8// TODO: These types should be put in a more general module.
9
10#[cw_serde]
11pub enum NftMetadataType {
12    OnChainMetadata,
13    OffChainMetadata,
14}
15
16#[cw_serde]
17pub struct NftData {
18    pub nft_data_type: NftMetadataType,
19    pub extension: Option<Metadata>,
20    pub token_uri: Option<String>,
21}
22
23impl NftData {
24    pub fn validate(nft_data: NftData) -> Result<Self, ContractError> {
25        ensure!(
26            nft_data.valid_nft_data(),
27            ContractError::InvalidNftDataProvided {}
28        );
29
30        // Validation of the metadata and token_uri is validated at the nft contract level
31
32        Ok(NftData {
33            nft_data_type: nft_data.nft_data_type,
34            extension: nft_data.extension,
35            token_uri: nft_data.token_uri,
36        })
37    }
38
39    pub fn valid_nft_data(&self) -> bool {
40        if self.token_uri.is_some() && self.extension.is_some() {
41            return false;
42        }
43        if self.token_uri.is_some() && self.nft_data_type == NftMetadataType::OffChainMetadata {
44            true
45        } else {
46            self.extension.is_some() && self.nft_data_type == NftMetadataType::OnChainMetadata
47        }
48    }
49}