From 86d7a78d26246b878701f5e4609251414ba9b242 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 19 Sep 2022 15:46:03 +0200 Subject: [PATCH 1/6] have the QueryResponses macro handle generics --- packages/schema-derive/src/query_responses.rs | 94 ++++++++++++++++++- 1 file changed, 93 insertions(+), 1 deletion(-) diff --git a/packages/schema-derive/src/query_responses.rs b/packages/schema-derive/src/query_responses.rs index 3cd3182ccc..9012ae17c3 100644 --- a/packages/schema-derive/src/query_responses.rs +++ b/packages/schema-derive/src/query_responses.rs @@ -7,10 +7,13 @@ pub fn query_responses_derive_impl(input: ItemEnum) -> ItemImpl { queries.sort(); let mappings = mappings.map(parse_tuple); + // Handle generics if the type has any + let (impl_generics, type_generics, maybe_where) = input.generics.split_for_impl(); + parse_quote! { #[automatically_derived] #[cfg(not(target_arch = "wasm32"))] - impl ::cosmwasm_schema::QueryResponses for #ident { + impl #impl_generics ::cosmwasm_schema::QueryResponses for #ident #type_generics #maybe_where { fn response_schemas_impl() -> ::std::collections::BTreeMap { ::std::collections::BTreeMap::from([ #( #mappings, )* @@ -113,6 +116,95 @@ mod tests { ); } + #[test] + fn generics() { + let input: ItemEnum = parse_quote! { + #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema, QueryResponses)] + #[serde(rename_all = "snake_case")] + pub enum QueryMsg { + #[returns(bool)] + Foo, + #[returns(u32)] + Bar(T), + } + }; + + let input2: ItemEnum = parse_quote! { + #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema, QueryResponses)] + #[serde(rename_all = "snake_case")] + pub enum QueryMsg { + #[returns(bool)] + Foo, + #[returns(u32)] + Bar { data: T }, + } + }; + + let input3: ItemEnum = parse_quote! { + #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema, QueryResponses)] + #[serde(rename_all = "snake_case")] + pub enum QueryMsg + where T: std::fmt::Debug + SomeTrait, + { + #[returns(bool)] + Foo, + #[returns(u32)] + Bar { data: T }, + } + }; + + let result = query_responses_derive_impl(input); + dbg!(&result); + assert_eq!( + result, + parse_quote! { + #[automatically_derived] + #[cfg(not(target_arch = "wasm32"))] + impl ::cosmwasm_schema::QueryResponses for QueryMsg { + fn response_schemas_impl() -> ::std::collections::BTreeMap { + ::std::collections::BTreeMap::from([ + ("foo".to_string(), ::cosmwasm_schema::schema_for!(bool)), + ("bar".to_string(), ::cosmwasm_schema::schema_for!(u32)), + ]) + } + } + } + ); + assert_eq!( + query_responses_derive_impl(input2), + parse_quote! { + #[automatically_derived] + #[cfg(not(target_arch = "wasm32"))] + impl ::cosmwasm_schema::QueryResponses for QueryMsg { + fn response_schemas_impl() -> ::std::collections::BTreeMap { + ::std::collections::BTreeMap::from([ + ("foo".to_string(), ::cosmwasm_schema::schema_for!(bool)), + ("bar".to_string(), ::cosmwasm_schema::schema_for!(u32)), + ]) + } + } + } + ); + let a = query_responses_derive_impl(input3); + assert_eq!( + a, + parse_quote! { + #[automatically_derived] + #[cfg(not(target_arch = "wasm32"))] + impl ::cosmwasm_schema::QueryResponses for QueryMsg + where T: std::fmt::Debug + SomeTrait, + { + fn response_schemas_impl() -> ::std::collections::BTreeMap { + ::std::collections::BTreeMap::from([ + ("foo".to_string(), ::cosmwasm_schema::schema_for!(bool)), + ("bar".to_string(), ::cosmwasm_schema::schema_for!(u32)), + ]) + } + } + } + ); + } + #[test] #[should_panic(expected = "missing return type for query: Supply")] fn missing_return() { From 32004b09fb17da06de0f5df692e235edae0a8fe6 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 19 Sep 2022 15:51:15 +0200 Subject: [PATCH 2/6] test for QueryMsgs with generics implementing QueryResponses --- packages/schema/tests/idl.rs | 40 ++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/packages/schema/tests/idl.rs b/packages/schema/tests/idl.rs index 4da2670a88..885e13d31a 100644 --- a/packages/schema/tests/idl.rs +++ b/packages/schema/tests/idl.rs @@ -106,3 +106,43 @@ fn test_query_responses() { // Find the "balance" query in responses api.get("responses").unwrap().get("balance").unwrap(); } + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, QueryResponses)] +#[serde(rename_all = "snake_case")] +pub enum QueryMsgWithGenerics +where + T: JsonSchema, +{ + #[returns(u128)] + QueryData { data: T }, +} + +#[test] +fn test_query_responses_generics() { + let api_str = generate_api! { + instantiate: InstantiateMsg, + query: QueryMsgWithGenerics, + } + .render() + .to_string() + .unwrap(); + + let api: Value = serde_json::from_str(&api_str).unwrap(); + let queries = api + .get("query") + .unwrap() + .get("oneOf") + .unwrap() + .as_array() + .unwrap(); + + // Find the "balance" query in the queries schema + assert_eq!(queries.len(), 1); + assert_eq!( + queries[0].get("required").unwrap().get(0).unwrap(), + "query_data" + ); + + // Find the "balance" query in responses + api.get("responses").unwrap().get("query_data").unwrap(); +} From dd95a5359f597f3e3da7021d0d513c5bbde3fd74 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 19 Sep 2022 16:01:20 +0200 Subject: [PATCH 3/6] style --- packages/schema-derive/src/query_responses.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/schema-derive/src/query_responses.rs b/packages/schema-derive/src/query_responses.rs index 9012ae17c3..923fad014b 100644 --- a/packages/schema-derive/src/query_responses.rs +++ b/packages/schema-derive/src/query_responses.rs @@ -8,12 +8,12 @@ pub fn query_responses_derive_impl(input: ItemEnum) -> ItemImpl { let mappings = mappings.map(parse_tuple); // Handle generics if the type has any - let (impl_generics, type_generics, maybe_where) = input.generics.split_for_impl(); + let (impl_generics, type_generics, where_clause) = input.generics.split_for_impl(); parse_quote! { #[automatically_derived] #[cfg(not(target_arch = "wasm32"))] - impl #impl_generics ::cosmwasm_schema::QueryResponses for #ident #type_generics #maybe_where { + impl #impl_generics ::cosmwasm_schema::QueryResponses for #ident #type_generics #where_clause { fn response_schemas_impl() -> ::std::collections::BTreeMap { ::std::collections::BTreeMap::from([ #( #mappings, )* From 7c6e173530420d8b8f2ecdd6076647ed2ac797e2 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 19 Sep 2022 16:09:24 +0200 Subject: [PATCH 4/6] CHANGELOG --- CHANGELOG.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f12371d6e8..c92922d9ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,10 +12,15 @@ and this project adheres to to be relatively close to each other ([#1417]). - cosmwasm-std: Add `HexBinary` which is like `Binary` but encodes to hex strings in JSON. Add `StdError::InvalidHex` error case. ([#1425]) - + [#1417]: https://github.com/CosmWasm/cosmwasm/issues/1417 [#1425]: https://github.com/CosmWasm/cosmwasm/pull/1425 +### Fixed + +- cosmwasm-schema: The `QueryResponses` derive macro now supports `QueryMsg`s + with generics. + ## [1.1.1] - 2022-09-15 ### Fixed From 868add40ac71f8e6655f3dbf7290b92b6dd18b68 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 19 Sep 2022 16:12:26 +0200 Subject: [PATCH 5/6] fmt CHANGELOG --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f8e096be8f..43d9700e7b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,7 @@ and this project adheres to to be relatively close to each other ([#1417]). - cosmwasm-std: Add `HexBinary` which is like `Binary` but encodes to hex strings in JSON. Add `StdError::InvalidHex` error case. ([#1425]) - + [#1417]: https://github.com/CosmWasm/cosmwasm/issues/1417 [#1425]: https://github.com/CosmWasm/cosmwasm/pull/1425 From a20d5f910538dcb87bffcd58b8ed943db9fae2aa Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 19 Sep 2022 16:20:34 +0200 Subject: [PATCH 6/6] correct CHANGELOG entry --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 43d9700e7b..3bf5e4a99e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,7 +24,7 @@ and this project adheres to with generics. ([#1429]) [#1426]: https://github.com/CosmWasm/cosmwasm/issues/1426 -[#1429]: https://github.com/CosmWasm/cosmwasm/issues/1429 +[#1429]: https://github.com/CosmWasm/cosmwasm/pull/1429 ## [1.1.1] - 2022-09-15