Skip to content

Commit

Permalink
Add QueryResponseType trait
Browse files Browse the repository at this point in the history
  • Loading branch information
webmaster128 committed Jan 2, 2023
1 parent 2bd030a commit b8dd1af
Show file tree
Hide file tree
Showing 5 changed files with 34 additions and 15 deletions.
3 changes: 2 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@ and this project adheres to
- cosmwasm-std: Upgrade `serde-json-wasm` dependency to 0.5.0 which adds map
support to `to_vec`/`to_binary` and friends.
- cosmwasm-std: Implement `AsRef<[u8]>` for `Binary` and `HexBinary` ([#1550]).
- cosmwasm-std: Add constructor `SupplyResponse::new` ([#1552]).
- cosmwasm-std: Allow constructing `SupplyResponse` via a `Default`
implementation ([#1552]).

[#1436]: https://github.com/CosmWasm/cosmwasm/issues/1436
[#1437]: https://github.com/CosmWasm/cosmwasm/issues/1437
Expand Down
23 changes: 10 additions & 13 deletions packages/std/src/query/bank.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ use serde::{Deserialize, Serialize};

use crate::Coin;

use super::query_response::QueryResponseType;

#[non_exhaustive]
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)]
#[serde(rename_all = "snake_case")]
Expand All @@ -22,7 +24,7 @@ pub enum BankQuery {
}

#[cfg(feature = "cosmwasm_1_1")]
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)]
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq, Eq, JsonSchema)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub struct SupplyResponse {
Expand All @@ -32,28 +34,23 @@ pub struct SupplyResponse {
}

#[cfg(feature = "cosmwasm_1_1")]
impl SupplyResponse {
/// Constructor for testing frameworks such as cw-multi-test.
/// This is required because query response types should be #[non_exhaustive].
/// As a contract developer you should not need this constructor since
/// query responses are constructed for you via deserialization.
#[doc(hidden)]
pub fn new(amount: Coin) -> Self {
Self { amount }
}
}
impl QueryResponseType for SupplyResponse {}

#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)]
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq, Eq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub struct BalanceResponse {
/// Always returns a Coin with the requested denom.
/// This may be of 0 amount if no such funds.
pub amount: Coin,
}

#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)]
impl QueryResponseType for BalanceResponse {}

#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq, Eq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub struct AllBalanceResponse {
/// Returns all non-zero coins held by this account.
pub amount: Vec<Coin>,
}

impl QueryResponseType for AllBalanceResponse {}
1 change: 1 addition & 0 deletions packages/std/src/query/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ use crate::Empty;

mod bank;
mod ibc;
mod query_response;
mod staking;
mod wasm;

Expand Down
16 changes: 16 additions & 0 deletions packages/std/src/query/query_response.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
use serde::de::DeserializeOwned;

/// A marker trait for query response types.
///
/// Those types have in common that they should be `#[non_exhaustive]` in order
/// to allow adding fields in a backwards compatible way. In contracts they are
/// only constructed through deserialization. We want to make it hard for
/// contract developers to construct those types themselves as this is most likely
/// not what they should do.
///
/// In hosts they are constructed as follows:
/// - wasmvm: Go types with the same JSON layout
/// - multi-test/cw-sdk: create a default instance and mutate the fields
///
/// This trait is crate-internal and can change any time.
pub(crate) trait QueryResponseType: Default + DeserializeOwned {}
6 changes: 5 additions & 1 deletion packages/std/src/query/wasm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ use serde::{Deserialize, Serialize};

use crate::Binary;

use super::query_response::QueryResponseType;

#[non_exhaustive]
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)]
#[serde(rename_all = "snake_case")]
Expand All @@ -27,7 +29,7 @@ pub enum WasmQuery {
}

#[non_exhaustive]
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)]
#[derive(Serialize, Deserialize, Clone, Default, Debug, PartialEq, Eq, JsonSchema)]
pub struct ContractInfoResponse {
pub code_id: u64,
/// address that instantiated this contract
Expand All @@ -40,6 +42,8 @@ pub struct ContractInfoResponse {
pub ibc_port: Option<String>,
}

impl QueryResponseType for ContractInfoResponse {}

impl ContractInfoResponse {
/// Constructor for testing frameworks such as cw-multi-test.
/// This is required because query response types should be #[non_exhaustive].
Expand Down

0 comments on commit b8dd1af

Please sign in to comment.