Skip to content

Commit

Permalink
Add enum codegen
Browse files Browse the repository at this point in the history
  • Loading branch information
aumetra committed Oct 8, 2024
1 parent 27d31ad commit 10ee9fa
Show file tree
Hide file tree
Showing 9 changed files with 105 additions and 0 deletions.
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions packages/cw-schema-codegen/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,6 @@ log = "0.4.22"
serde_json = "1.0.128"
simple_logger = "5.0.0"
strum = { version = "0.26.3", default-features = false, features = ["derive"] }

[dev-dependencies]
insta = "1.40.0"
1 change: 1 addition & 0 deletions packages/cw-schema-codegen/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
pub mod rust;
13 changes: 13 additions & 0 deletions packages/cw-schema-codegen/src/rust.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
use askama::Template;

pub struct EnumVariantTemplate<'a> {
pub name: &'a str,
pub types: Option<&'a [&'a str]>,
}

#[derive(Template)]
#[template(escape = "none", path = "rust/enum.tpl.rs")]
pub struct EnumTemplate<'a> {
pub name: &'a str,
pub variants: &'a [EnumVariantTemplate<'a>],
}
5 changes: 5 additions & 0 deletions packages/cw-schema-codegen/templates/rust/enum.tpl.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
pub enum {{ name }} {
{% for variant in variants %}
{{ variant.name }} {% if let Some(types) = variant.types %}({% for ty in types %} {{ ty }}, {% endfor %}) {% endif %},
{% endfor %}
}
53 changes: 53 additions & 0 deletions packages/cw-schema-codegen/tests/rust_tpl.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
use askama::Template;
use cw_schema_codegen::rust::{EnumTemplate, EnumVariantTemplate};

#[test]
fn simple_enum() {
let tpl = EnumTemplate {
name: "Simple",
variants: &[
EnumVariantTemplate {
name: "One",
types: None,
},
EnumVariantTemplate {
name: "Two",
types: None,
},
],
};

let rendered = tpl.render().unwrap();
insta::assert_snapshot!(rendered);
}

#[test]
fn complex_enum() {
let tpl = EnumTemplate {
name: "Complex",
variants: &[
EnumVariantTemplate {
name: "One",
types: Some(&["u64"]),
},
EnumVariantTemplate {
name: "Two",
types: Some(&["String", "u64"]),
},
],
};

let rendered = tpl.render().unwrap();
insta::assert_snapshot!(rendered);
}

#[test]
fn empty_enum() {
let tpl = EnumTemplate {
name: "Empty",
variants: &[],
};

let rendered = tpl.render().unwrap();
insta::assert_snapshot!(rendered);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
source: packages/cw-schema-codegen/tests/rust_tpl.rs
expression: rendered
---
pub enum Complex {

One ( u64, ) ,

Two ( String, u64, ) ,

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
source: packages/cw-schema-codegen/tests/rust_tpl.rs
expression: rendered
---
pub enum Empty {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
source: packages/cw-schema-codegen/tests/rust_tpl.rs
expression: rendered
---
pub enum Simple {

One ,

Two ,

}

0 comments on commit 10ee9fa

Please sign in to comment.