andromeda-std 1.0.0

The standard library for creating an Andromeda Digital Object
Documentation
use crate::ado_contract::state::ADOContract;
use crate::{
    ado_base::{
        ado_type::TypeResponse,
        block_height::BlockHeightResponse,
        kernel_address::KernelAddressResponse,
        ownership::{ContractOwnerResponse, PublisherResponse},
        version::VersionResponse,
        AndromedaQuery,
    },
    common::encode_binary,
    error::ContractError,
};
use cosmwasm_std::{from_json, to_json_binary, Binary, Deps, Env};
use cw2::get_contract_version;
use serde::Serialize;

impl<'a> ADOContract<'a> {
    #[allow(unreachable_patterns)]
    pub fn query(
        &self,
        deps: Deps,
        _env: Env,
        msg: impl Serialize,
    ) -> Result<Binary, ContractError> {
        let msg = to_json_binary(&msg)?;

        match from_json::<AndromedaQuery>(&msg) {
            Ok(msg) => match msg {
                AndromedaQuery::Owner {} => encode_binary(&self.query_contract_owner(deps)?),
                AndromedaQuery::OriginalPublisher {} => {
                    encode_binary(&self.query_original_publisher(deps)?)
                }
                AndromedaQuery::Type {} => encode_binary(&self.query_type(deps)?),
                AndromedaQuery::BlockHeightUponCreation {} => {
                    encode_binary(&self.query_block_height_upon_creation(deps)?)
                }
                AndromedaQuery::KernelAddress {} => {
                    encode_binary(&self.query_kernel_address(deps)?)
                }
                AndromedaQuery::Version {} => encode_binary(&self.query_version(deps)?),
                AndromedaQuery::OwnershipRequest {} => {
                    encode_binary(&self.ownership_request(deps.storage)?)
                }
                #[cfg(feature = "modules")]
                AndromedaQuery::Module { id } => encode_binary(&self.query_module(deps, id)?),
                #[cfg(feature = "modules")]
                AndromedaQuery::ModuleIds {} => encode_binary(&self.query_module_ids(deps)?),
                AndromedaQuery::AppContract {} => {
                    encode_binary(&self.get_app_contract(deps.storage)?)
                }
                AndromedaQuery::Permissions {
                    actor,
                    limit,
                    start_after,
                } => encode_binary(&self.query_permissions(deps, actor, limit, start_after)?),
                AndromedaQuery::PermissionedActions {} => {
                    encode_binary(&self.query_permissioned_actions(deps)?)
                }
                _ => Err(ContractError::UnsupportedOperation {}),
            },
            Err(_) => Err(ContractError::UnsupportedOperation {}),
        }
    }
}

impl<'a> ADOContract<'a> {
    #[inline]
    pub fn query_contract_owner(&self, deps: Deps) -> Result<ContractOwnerResponse, ContractError> {
        let owner = self.owner.load(deps.storage)?;

        Ok(ContractOwnerResponse {
            owner: owner.to_string(),
        })
    }

    #[inline]
    pub fn query_kernel_address(&self, deps: Deps) -> Result<KernelAddressResponse, ContractError> {
        let kernel_address = self.kernel_address.load(deps.storage)?;
        Ok(KernelAddressResponse { kernel_address })
    }

    #[inline]
    pub fn query_original_publisher(&self, deps: Deps) -> Result<PublisherResponse, ContractError> {
        let original_publisher = self.original_publisher.load(deps.storage)?.to_string();
        Ok(PublisherResponse { original_publisher })
    }

    #[inline]
    pub fn query_block_height_upon_creation(
        &self,
        deps: Deps,
    ) -> Result<BlockHeightResponse, ContractError> {
        let block_height = self.block_height.load(deps.storage)?;
        Ok(BlockHeightResponse { block_height })
    }

    #[inline]
    pub fn query_type(&self, deps: Deps) -> Result<TypeResponse, ContractError> {
        let ado_type = self.ado_type.load(deps.storage)?;
        Ok(TypeResponse { ado_type })
    }

    #[inline]
    pub fn query_version(&self, deps: Deps) -> Result<VersionResponse, ContractError> {
        let contract_version = get_contract_version(deps.storage)?;
        Ok(VersionResponse {
            version: contract_version.version,
        })
    }
}