Query
In the previous section we talked about the execute entrypoint. The query entrypoint is actually pretty similar to its sibling execute, but with one key difference: the storage is only accessible immutably. This means you can only read from the storage but not write to it.
Properly defining a message
When defining a message for queries, you always return some value. To properly document these return values, you'll want to define them in your schema.
This is where the cosmwasm_schema::QueryResponses
derive macro comes in.
contract.rs
#[cw_serde]
struct GreetResponse {
message: String,
}
#[cw_serde]
struct GoodbyeResponse {
message: String,
}
#[cw_serde]
#[derive(QueryResponses)]
enum CustomQueryMsg {
#[returns(GreetResponse)]
Greet,
#[returns(GoodbyeResponse)]
Goodbye,
}
The macro then defines the required code to document the responses in your code properly, so you can easily generate, for example, TypeScript types for your contract clients.
Definition
contract.rs
#[cfg_attr(not(feature = "library"), entry_point)]
pub fn query(
deps: Deps,
env: Env,
msg: QueryMsg,
) -> StdResult<QueryResponse> {
// TODO: Prepare the response here.
Ok(QueryResponse::default())
}