Skip to content

Commit 08d06c4

Browse files
committed
Deserialize the full CosmWasm API definition
1 parent 386a467 commit 08d06c4

File tree

8 files changed

+90
-47
lines changed

8 files changed

+90
-47
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/cw-schema-codegen/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ publish = false
99
anyhow = "1.0.89"
1010
askama = { version = "0.12.1", default-features = false }
1111
clap = { version = "4.5.18", features = ["derive"] }
12+
cosmwasm-schema = { version = "=2.2.0-rc.1", path = "../schema" }
1213
cw-schema = { version = "=2.2.0-rc.1", path = "../cw-schema" }
1314
either = "1.13.0"
1415
frunk = "0.4.3"

packages/cw-schema-codegen/src/main.rs

Lines changed: 59 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ extern crate log;
66

77
use clap::{Parser, ValueEnum};
88
use std::{
9+
collections::HashSet,
910
fs::{self, File},
1011
io::{self, Write},
1112
path::PathBuf,
@@ -49,9 +50,38 @@ impl Opts {
4950
}
5051
}
5152

53+
fn generate_defs<W>(
54+
output: &mut W,
55+
language: Language,
56+
schema: &cw_schema::Schema,
57+
) -> anyhow::Result<()>
58+
where
59+
W: io::Write,
60+
{
61+
let cw_schema::Schema::V1(schema) = schema else {
62+
bail!("Only schema version 1 is supported")
63+
};
64+
65+
schema.definitions.iter().try_for_each(|node| {
66+
debug!("Processing node: {node:?}");
67+
68+
match language {
69+
Language::Rust => cw_schema_codegen::rust::process_node(output, schema, node),
70+
Language::Typescript => {
71+
cw_schema_codegen::typescript::process_node(output, schema, node)
72+
}
73+
Language::Go | Language::Python => todo!(),
74+
}
75+
})?;
76+
77+
Ok(())
78+
}
79+
5280
fn main() -> anyhow::Result<()> {
5381
simple_logger::SimpleLogger::new()
5482
.without_timestamps()
83+
.with_level(log::LevelFilter::Info)
84+
.env()
5585
.init()?;
5686

5787
let opts: Opts = Opts::parse();
@@ -70,24 +100,40 @@ fn main() -> anyhow::Result<()> {
70100
);
71101

72102
let schema = fs::read_to_string(&opts.file)?;
73-
let schema: cw_schema::Schema = serde_json::from_str(&schema)?;
74-
let cw_schema::Schema::V1(schema) = schema else {
75-
bail!("Unsupported schema version");
76-
};
103+
let schema: cosmwasm_schema::JsonCwApi = serde_json::from_str(&schema)?;
77104

78105
let mut output = opts.output()?;
79106

80-
schema.definitions.iter().try_for_each(|node| {
81-
debug!("Processing node: {node:?}");
107+
if let Some(ref instantiate) = schema.instantiate {
108+
generate_defs(&mut output, opts.language, instantiate)?;
109+
}
82110

83-
match opts.language {
84-
Language::Rust => cw_schema_codegen::rust::process_node(&mut output, &schema, node),
85-
Language::Typescript => {
86-
cw_schema_codegen::typescript::process_node(&mut output, &schema, node)
87-
}
88-
Language::Go | Language::Python => todo!(),
111+
if let Some(ref execute) = schema.execute {
112+
generate_defs(&mut output, opts.language, execute)?;
113+
}
114+
115+
if let Some(ref query) = schema.query {
116+
generate_defs(&mut output, opts.language, query)?;
117+
}
118+
119+
if let Some(ref migrate) = schema.migrate {
120+
generate_defs(&mut output, opts.language, migrate)?;
121+
}
122+
123+
if let Some(ref sudo) = schema.sudo {
124+
generate_defs(&mut output, opts.language, sudo)?;
125+
}
126+
127+
if let Some(ref responses) = schema.responses {
128+
let responses = responses
129+
.iter()
130+
.map(|(_name, response)| response)
131+
.collect::<HashSet<_>>();
132+
133+
for response in responses {
134+
generate_defs(&mut output, opts.language, response)?;
89135
}
90-
})?;
136+
}
91137

92138
Ok(())
93139
}

packages/cw-schema-codegen/src/rust/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,10 @@ fn expand_node_name<'a>(
4141
cw_schema::NodeType::Enum { .. } => node.name.as_ref().into(),
4242

4343
cw_schema::NodeType::Decimal { precision, signed } => todo!(),
44-
cw_schema::NodeType::Address => todo!(),
45-
cw_schema::NodeType::Checksum => todo!(),
44+
cw_schema::NodeType::Address => "cosmrs::AccountId".into(),
45+
cw_schema::NodeType::Checksum => "cosmrs::tendermint::Hash".into(),
4646
cw_schema::NodeType::HexBinary => todo!(),
47-
cw_schema::NodeType::Timestamp => todo!(),
47+
cw_schema::NodeType::Timestamp => "cosmrs::tendermint::Time".into(),
4848
cw_schema::NodeType::Unit => Cow::Borrowed("()"),
4949
}
5050
}

packages/cw-schema-codegen/src/typescript/mod.rs

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,7 @@ fn expand_node_name<'a>(
1919
cw_schema::NodeType::Double => "number".into(),
2020
cw_schema::NodeType::Boolean => "boolean".into(),
2121
cw_schema::NodeType::String => "string".into(),
22-
cw_schema::NodeType::Integer { signed, precision } => {
23-
"string".into()
24-
/*let ty = if signed { "i" } else { "u" };
25-
format!("{ty}{precision}").into()*/
26-
}
22+
cw_schema::NodeType::Integer { .. } => "string".into(),
2723
cw_schema::NodeType::Binary => "Uint8Array".into(),
2824
cw_schema::NodeType::Optional { inner } => {
2925
let inner = &schema.definitions[inner];
@@ -41,8 +37,8 @@ fn expand_node_name<'a>(
4137
}
4238
cw_schema::NodeType::Enum { .. } => node.name.as_ref().into(),
4339

44-
cw_schema::NodeType::Decimal { precision, signed } => todo!(),
45-
cw_schema::NodeType::Address => todo!(),
40+
cw_schema::NodeType::Decimal { .. } => "string".into(),
41+
cw_schema::NodeType::Address => "string".into(),
4642
cw_schema::NodeType::Checksum => todo!(),
4743
cw_schema::NodeType::HexBinary => todo!(),
4844
cw_schema::NodeType::Timestamp => todo!(),
@@ -51,12 +47,8 @@ fn expand_node_name<'a>(
5147
}
5248

5349
fn prepare_docs(desc: Option<&str>) -> Cow<'_, [Cow<'_, str>]> {
54-
desc.map(|desc| {
55-
desc.lines()
56-
.map(|line| line.replace('"', "\\\"").into())
57-
.collect()
58-
})
59-
.unwrap_or(Cow::Borrowed(&[]))
50+
desc.map(|desc| desc.lines().map(Into::into).collect())
51+
.unwrap_or(Cow::Borrowed(&[]))
6052
}
6153

6254
pub fn process_node<O>(

packages/cw-schema/src/lib.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ pub type DefinitionReference = usize;
1919
mod default_impls;
2020

2121
#[skip_serializing_none]
22-
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
22+
#[derive(Clone, Debug, Eq, Hash, PartialEq, Deserialize, Serialize)]
2323
#[cfg_attr(feature = "std", derive(::schemars::JsonSchema))]
2424
#[serde(rename_all = "camelCase")]
2525
pub struct StructProperty {
@@ -28,7 +28,7 @@ pub struct StructProperty {
2828
}
2929

3030
#[skip_serializing_none]
31-
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
31+
#[derive(Clone, Debug, Eq, Hash, PartialEq, Deserialize, Serialize)]
3232
#[cfg_attr(feature = "std", derive(::schemars::JsonSchema))]
3333
#[serde(rename_all = "camelCase", untagged)]
3434
pub enum StructType {
@@ -42,7 +42,7 @@ pub enum StructType {
4242
}
4343

4444
#[skip_serializing_none]
45-
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
45+
#[derive(Clone, Debug, Eq, Hash, PartialEq, Deserialize, Serialize)]
4646
#[cfg_attr(feature = "std", derive(::schemars::JsonSchema))]
4747
#[serde(rename_all = "camelCase")]
4848
pub struct EnumCase {
@@ -52,7 +52,7 @@ pub struct EnumCase {
5252
}
5353

5454
#[skip_serializing_none]
55-
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
55+
#[derive(Clone, Debug, Eq, Hash, PartialEq, Deserialize, Serialize)]
5656
#[cfg_attr(feature = "std", derive(::schemars::JsonSchema))]
5757
#[serde(rename_all = "camelCase", tag = "type")]
5858
pub enum EnumValue {
@@ -66,7 +66,7 @@ pub enum EnumValue {
6666
}
6767

6868
#[skip_serializing_none]
69-
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
69+
#[derive(Clone, Debug, Eq, Hash, PartialEq, Deserialize, Serialize)]
7070
#[cfg_attr(feature = "std", derive(::schemars::JsonSchema))]
7171
#[serde(rename_all = "camelCase", tag = "type")]
7272
pub enum NodeType {
@@ -113,7 +113,7 @@ pub enum NodeType {
113113
}
114114

115115
#[skip_serializing_none]
116-
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
116+
#[derive(Clone, Debug, Eq, Hash, PartialEq, Deserialize, Serialize)]
117117
#[cfg_attr(feature = "std", derive(::schemars::JsonSchema))]
118118
#[serde(rename_all = "camelCase")]
119119
pub struct Node {
@@ -124,7 +124,7 @@ pub struct Node {
124124
}
125125

126126
#[skip_serializing_none]
127-
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
127+
#[derive(Clone, Debug, Eq, Hash, PartialEq, Deserialize, Serialize)]
128128
#[cfg_attr(feature = "std", derive(::schemars::JsonSchema))]
129129
#[serde(rename_all = "camelCase")]
130130
pub struct SchemaV1 {
@@ -133,7 +133,7 @@ pub struct SchemaV1 {
133133
}
134134

135135
#[skip_serializing_none]
136-
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
136+
#[derive(Clone, Debug, Eq, Hash, PartialEq, Deserialize, Serialize)]
137137
#[cfg_attr(feature = "std", derive(::schemars::JsonSchema))]
138138
#[serde(rename_all = "camelCase", tag = "type")]
139139
#[non_exhaustive]

packages/schema/src/idl.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -98,17 +98,17 @@ impl Api {
9898
}
9999

100100
/// A JSON representation of a contract's API.
101-
#[derive(serde::Serialize)]
101+
#[derive(serde::Deserialize, serde::Serialize)]
102102
pub struct JsonCwApi {
103-
contract_name: String,
104-
contract_version: String,
105-
idl_version: String,
106-
instantiate: Option<cw_schema::Schema>,
107-
execute: Option<cw_schema::Schema>,
108-
query: Option<cw_schema::Schema>,
109-
migrate: Option<cw_schema::Schema>,
110-
sudo: Option<cw_schema::Schema>,
111-
responses: Option<BTreeMap<String, cw_schema::Schema>>,
103+
pub contract_name: String,
104+
pub contract_version: String,
105+
pub idl_version: String,
106+
pub instantiate: Option<cw_schema::Schema>,
107+
pub execute: Option<cw_schema::Schema>,
108+
pub query: Option<cw_schema::Schema>,
109+
pub migrate: Option<cw_schema::Schema>,
110+
pub sudo: Option<cw_schema::Schema>,
111+
pub responses: Option<BTreeMap<String, cw_schema::Schema>>,
112112
}
113113

114114
impl JsonCwApi {

packages/schema/src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,3 +97,6 @@ pub use cosmwasm_schema_derive::write_api;
9797
pub use cw_schema;
9898
pub use schemars;
9999
pub use serde;
100+
101+
#[doc(hidden)]
102+
pub use self::idl::JsonCwApi;

0 commit comments

Comments
 (0)