Skip to content

Commit 30b0d91

Browse files
committed
Add struct codegen
1 parent 2780474 commit 30b0d91

File tree

7 files changed

+106
-5
lines changed

7 files changed

+106
-5
lines changed

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,10 @@ fn main() -> anyhow::Result<()> {
5454
.init()?;
5555

5656
let opts: Opts = Opts::parse();
57-
info!("Generating code for {:?} from {:?}", opts.language, opts.file);
57+
info!(
58+
"Generating code for {:?} from {:?}",
59+
opts.language, opts.file
60+
);
5861

5962
let schema = std::fs::read_to_string(&opts.file)?;
6063
let schema: cw_schema::Schema = serde_json::from_str(&schema)?;

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,7 @@ pub struct FieldTemplate<'a> {
2020
pub enum TypeTemplate<'a> {
2121
Unit,
2222
Tuple(&'a [&'a str]),
23-
Named {
24-
fields: &'a [FieldTemplate<'a>],
25-
}
23+
Named { fields: &'a [FieldTemplate<'a>] },
2624
}
2725

2826
#[derive(Template)]
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
pub struct {{ name }}
2+
3+
{% match ty %}
4+
{% when TypeTemplate::Unit %}
5+
;
6+
{% when TypeTemplate::Tuple with (types) %}
7+
(
8+
{% for ty in types %}
9+
{{ ty }},
10+
{% endfor %}
11+
);
12+
{% when TypeTemplate::Named with { fields } %}
13+
{
14+
{% for field in fields %}
15+
{{ field.name }}: {{ field.ty }},
16+
{% endfor %}
17+
}
18+
{% endmatch %}

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

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
use askama::Template;
2-
use cw_schema_codegen::rust::{EnumTemplate, EnumVariantTemplate, FieldTemplate, TypeTemplate};
2+
use cw_schema_codegen::rust::{
3+
EnumTemplate, EnumVariantTemplate, FieldTemplate, StructTemplate, TypeTemplate,
4+
};
35

46
#[test]
57
fn simple_enum() {
@@ -62,3 +64,47 @@ fn empty_enum() {
6264
let rendered = tpl.render().unwrap();
6365
insta::assert_snapshot!(rendered);
6466
}
67+
68+
#[test]
69+
fn empty_struct() {
70+
let tpl = StructTemplate {
71+
name: "Empty",
72+
ty: TypeTemplate::Unit,
73+
};
74+
75+
let rendered = tpl.render().unwrap();
76+
insta::assert_snapshot!(rendered);
77+
}
78+
79+
#[test]
80+
fn tuple_struct() {
81+
let tpl = StructTemplate {
82+
name: "Tuple",
83+
ty: TypeTemplate::Tuple(&["u64", "String"]),
84+
};
85+
86+
let rendered = tpl.render().unwrap();
87+
insta::assert_snapshot!(rendered);
88+
}
89+
90+
#[test]
91+
fn named_struct() {
92+
let tpl = StructTemplate {
93+
name: "Named",
94+
ty: TypeTemplate::Named {
95+
fields: &[
96+
FieldTemplate {
97+
name: "a",
98+
ty: "u64",
99+
},
100+
FieldTemplate {
101+
name: "b",
102+
ty: "String",
103+
},
104+
],
105+
},
106+
};
107+
108+
let rendered = tpl.render().unwrap();
109+
insta::assert_snapshot!(rendered);
110+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
source: packages/cw-schema-codegen/tests/rust_tpl.rs
3+
expression: rendered
4+
---
5+
pub struct Empty
6+
7+
8+
;
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
---
2+
source: packages/cw-schema-codegen/tests/rust_tpl.rs
3+
expression: rendered
4+
---
5+
pub struct Named
6+
7+
8+
{
9+
10+
a: u64,
11+
12+
b: String,
13+
14+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
---
2+
source: packages/cw-schema-codegen/tests/rust_tpl.rs
3+
expression: rendered
4+
---
5+
pub struct Tuple
6+
7+
8+
(
9+
10+
u64,
11+
12+
String,
13+
14+
);

0 commit comments

Comments
 (0)