Skip to content

Commit db942c0

Browse files
committed
Add serde renames for prettier enums
1 parent 2b560a2 commit db942c0

File tree

12 files changed

+74
-37
lines changed

12 files changed

+74
-37
lines changed

packages/cw-schema-codegen/Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,10 @@ clap = { version = "4.5.18", features = ["derive"] }
1212
cw-schema = { version = "=2.2.0-rc.1", path = "../cw-schema" }
1313
either = "1.13.0"
1414
frunk = "0.4.3"
15+
heck = "0.5.0"
1516
log = "0.4.22"
1617
serde_json = "1.0.128"
17-
simple_logger = "5.0.0"
18+
simple_logger = { version = "5.0.0", features = ["stderr"] }
1819

1920
[dev-dependencies]
2021
insta = "1.40.0"

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

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use self::template::{
22
EnumTemplate, EnumVariantTemplate, FieldTemplate, StructTemplate, TypeTemplate,
33
};
4+
use heck::ToPascalCase;
45
use std::{borrow::Cow, io};
56

67
pub mod template;
@@ -38,7 +39,13 @@ fn expand_node_name<'a>(
3839
format!("({})", items).into()
3940
}
4041
cw_schema::NodeType::Enum { .. } => node.name.as_ref().into(),
41-
_ => todo!(),
42+
43+
cw_schema::NodeType::Decimal { precision, signed } => todo!(),
44+
cw_schema::NodeType::Address => todo!(),
45+
cw_schema::NodeType::Checksum => todo!(),
46+
cw_schema::NodeType::HexBinary => todo!(),
47+
cw_schema::NodeType::Timestamp => todo!(),
48+
cw_schema::NodeType::Unit => Cow::Borrowed("()"),
4249
}
4350
}
4451

@@ -62,46 +69,48 @@ where
6269
match node.value {
6370
cw_schema::NodeType::Struct(ref sty) => {
6471
let structt = StructTemplate {
65-
name: &node.name,
72+
name: node.name.clone(),
6673
docs: prepare_docs(node.description.as_deref()),
6774
ty: match sty {
6875
cw_schema::StructType::Unit => TypeTemplate::Unit,
6976
cw_schema::StructType::Named { ref properties } => TypeTemplate::Named {
7077
fields: properties
7178
.iter()
72-
.map(|(name, prop)| {
73-
let ty = expand_node_name(schema, &schema.definitions[prop.value]);
74-
FieldTemplate {
75-
name: Cow::Borrowed(name),
76-
docs: prepare_docs(prop.description.as_deref()),
77-
ty,
78-
}
79+
.map(|(name, prop)| FieldTemplate {
80+
name: Cow::Borrowed(name),
81+
docs: prepare_docs(prop.description.as_deref()),
82+
ty: expand_node_name(schema, &schema.definitions[prop.value]),
7983
})
8084
.collect(),
8185
},
82-
_ => unreachable!(),
86+
cw_schema::StructType::Tuple { ref items } => TypeTemplate::Tuple(
87+
items
88+
.iter()
89+
.map(|item| expand_node_name(schema, &schema.definitions[*item]))
90+
.collect(),
91+
),
8392
},
8493
};
8594

8695
writeln!(output, "{structt}")?;
8796
}
8897
cw_schema::NodeType::Enum { ref cases, .. } => {
8998
let enumm = EnumTemplate {
90-
name: &node.name,
99+
name: node.name.clone(),
91100
docs: prepare_docs(node.description.as_deref()),
92101
variants: cases
93102
.iter()
94103
.map(|(name, case)| EnumVariantTemplate {
95-
name,
104+
name: name.to_pascal_case().into(),
96105
docs: prepare_docs(case.description.as_deref()),
106+
serde_rename: Some(name.clone()),
97107
ty: match case.value {
98108
cw_schema::EnumValue::Unit => TypeTemplate::Unit,
99109
cw_schema::EnumValue::Tuple { ref items } => {
100110
let items = items
101111
.iter()
102112
.map(|item| {
103-
let node = &schema.definitions[*item];
104-
expand_node_name(schema, node)
113+
expand_node_name(schema, &schema.definitions[*item])
105114
})
106115
.collect();
107116

@@ -111,21 +120,17 @@ where
111120
TypeTemplate::Named {
112121
fields: properties
113122
.iter()
114-
.map(|(name, prop)| {
115-
let ty = expand_node_name(
123+
.map(|(name, prop)| FieldTemplate {
124+
name: Cow::Borrowed(name),
125+
docs: prepare_docs(prop.description.as_deref()),
126+
ty: expand_node_name(
116127
schema,
117128
&schema.definitions[prop.value],
118-
);
119-
FieldTemplate {
120-
name: Cow::Borrowed(name),
121-
docs: prepare_docs(prop.description.as_deref()),
122-
ty,
123-
}
129+
),
124130
})
125131
.collect(),
126132
}
127133
}
128-
_ => unreachable!(),
129134
},
130135
})
131136
.collect(),

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,16 @@ use std::borrow::Cow;
33

44
#[derive(Clone)]
55
pub struct EnumVariantTemplate<'a> {
6-
pub name: &'a str,
6+
pub name: Cow<'a, str>,
77
pub docs: Cow<'a, [Cow<'a, str>]>,
8+
pub serde_rename: Option<Cow<'a, str>>,
89
pub ty: TypeTemplate<'a>,
910
}
1011

1112
#[derive(Template)]
1213
#[template(escape = "none", path = "rust/enum.tpl.rs")]
1314
pub struct EnumTemplate<'a> {
14-
pub name: &'a str,
15+
pub name: Cow<'a, str>,
1516
pub docs: Cow<'a, [Cow<'a, str>]>,
1617
pub variants: Cow<'a, [EnumVariantTemplate<'a>]>,
1718
}
@@ -35,7 +36,7 @@ pub enum TypeTemplate<'a> {
3536
#[derive(Template)]
3637
#[template(escape = "none", path = "rust/struct.tpl.rs")]
3738
pub struct StructTemplate<'a> {
38-
pub name: &'a str,
39+
pub name: Cow<'a, str>,
3940
pub docs: Cow<'a, [Cow<'a, str>]>,
4041
pub ty: TypeTemplate<'a>,
4142
}

packages/cw-schema-codegen/templates/rust/enum.tpl.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,19 @@
22
#[doc = "{{ doc }}"]
33
{% endfor %}
44

5+
#[cosmwasm_schema::cw_serde]
56
pub enum {{ name }} {
67
{% for variant in variants %}
78
{% for doc in variant.docs %}
89
#[doc = "{{ doc }}"]
910
{% endfor %}
1011

12+
{% match variant.serde_rename %}
13+
{% when Some with (rename) %}
14+
#[serde(rename = "{{ rename }}")]
15+
{% when None %}
16+
{% endmatch %}
17+
1118
{{ variant.name }}
1219
{% match variant.ty %}
1320
{% when TypeTemplate::Unit %}

packages/cw-schema-codegen/templates/rust/struct.tpl.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#[doc = "{{ doc }}"]
33
{% endfor %}
44

5+
#[cosmwasm_schema::cw_serde]
56
pub struct {{ name }}
67

78
{% match ty %}

packages/cw-schema-codegen/tests/rust_tpl.rs

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,19 @@ use cw_schema_codegen::rust::template::{
88
#[test]
99
fn simple_enum() {
1010
let tpl = EnumTemplate {
11-
name: "Simple",
11+
name: Cow::Borrowed("Simple"),
1212
docs: Cow::Borrowed(&[Cow::Borrowed("Simple enum")]),
1313
variants: Cow::Borrowed(&[
1414
EnumVariantTemplate {
15-
name: "One",
15+
name: Cow::Borrowed("One"),
1616
docs: Cow::Borrowed(&[Cow::Borrowed("One variant")]),
17+
serde_rename: None,
1718
ty: TypeTemplate::Unit,
1819
},
1920
EnumVariantTemplate {
20-
name: "Two",
21+
name: Cow::Borrowed("Two"),
2122
docs: Cow::Borrowed(&[Cow::Borrowed("Two variant")]),
23+
serde_rename: None,
2224
ty: TypeTemplate::Unit,
2325
},
2426
]),
@@ -31,17 +33,19 @@ fn simple_enum() {
3133
#[test]
3234
fn complex_enum() {
3335
let tpl = EnumTemplate {
34-
name: "Complex",
36+
name: Cow::Borrowed("Complex"),
3537
docs: Cow::Borrowed(&[Cow::Borrowed("Complex enum")]),
3638
variants: Cow::Borrowed(&[
3739
EnumVariantTemplate {
38-
name: "One",
40+
name: Cow::Borrowed("One"),
3941
docs: Cow::Borrowed(&[Cow::Borrowed("One variant")]),
42+
serde_rename: None,
4043
ty: TypeTemplate::Tuple(Cow::Borrowed(&[Cow::Borrowed("u64")])),
4144
},
4245
EnumVariantTemplate {
43-
name: "Two",
46+
name: Cow::Borrowed("Two"),
4447
docs: Cow::Borrowed(&[Cow::Borrowed("Two variant")]),
48+
serde_rename: None,
4549
ty: TypeTemplate::Named {
4650
fields: Cow::Borrowed(&[
4751
FieldTemplate {
@@ -67,7 +71,7 @@ fn complex_enum() {
6771
#[test]
6872
fn empty_enum() {
6973
let tpl = EnumTemplate {
70-
name: "Empty",
74+
name: Cow::Borrowed("Empty"),
7175
docs: Cow::Borrowed(&[Cow::Borrowed("Empty enum")]),
7276
variants: Cow::Borrowed(&[]),
7377
};
@@ -79,7 +83,7 @@ fn empty_enum() {
7983
#[test]
8084
fn empty_struct() {
8185
let tpl = StructTemplate {
82-
name: "Empty",
86+
name: Cow::Borrowed("Empty"),
8387
docs: Cow::Borrowed(&[Cow::Borrowed("Empty struct")]),
8488
ty: TypeTemplate::Unit,
8589
};
@@ -91,7 +95,7 @@ fn empty_struct() {
9195
#[test]
9296
fn tuple_struct() {
9397
let tpl = StructTemplate {
94-
name: "Tuple",
98+
name: Cow::Borrowed("Tuple"),
9599
docs: Cow::Borrowed(&[Cow::Borrowed("Tuple struct")]),
96100
ty: TypeTemplate::Tuple(Cow::Borrowed(&[
97101
Cow::Borrowed("u64"),
@@ -106,7 +110,7 @@ fn tuple_struct() {
106110
#[test]
107111
fn named_struct() {
108112
let tpl = StructTemplate {
109-
name: "Named",
113+
name: Cow::Borrowed("Named"),
110114
docs: Cow::Borrowed(&[Cow::Borrowed("Named struct")]),
111115
ty: TypeTemplate::Named {
112116
fields: Cow::Borrowed(&[

packages/cw-schema-codegen/tests/snapshots/rust_tpl__complex_enum.snap

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,16 @@ expression: rendered
55
#[doc = "Complex enum"]
66

77

8+
#[cosmwasm_schema::cw_serde]
89
pub enum Complex {
910

1011

1112
#[doc = "One variant"]
1213

1314

15+
16+
17+
1418
One
1519

1620
(
@@ -25,6 +29,9 @@ pub enum Complex {
2529
#[doc = "Two variant"]
2630

2731

32+
33+
34+
2835
Two
2936

3037
{

packages/cw-schema-codegen/tests/snapshots/rust_tpl__empty_enum.snap

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ expression: rendered
55
#[doc = "Empty enum"]
66

77

8+
#[cosmwasm_schema::cw_serde]
89
pub enum Empty {
910

1011
}

packages/cw-schema-codegen/tests/snapshots/rust_tpl__empty_struct.snap

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ expression: rendered
55
#[doc = "Empty struct"]
66

77

8+
#[cosmwasm_schema::cw_serde]
89
pub struct Empty
910

1011

packages/cw-schema-codegen/tests/snapshots/rust_tpl__named_struct.snap

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ expression: rendered
55
#[doc = "Named struct"]
66

77

8+
#[cosmwasm_schema::cw_serde]
89
pub struct Named
910

1011

0 commit comments

Comments
 (0)