Skip to content

Commit 2b560a2

Browse files
committed
Slight refactor
1 parent 9855d42 commit 2b560a2

File tree

10 files changed

+195
-138
lines changed

10 files changed

+195
-138
lines changed

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

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

77
use clap::{Parser, ValueEnum};
88
use std::{
9-
borrow::Cow,
109
fs::{self, File},
1110
io::{self, Write},
1211
path::PathBuf,
@@ -17,6 +16,7 @@ pub enum Language {
1716
#[default]
1817
Rust,
1918
Go,
19+
Python,
2020
Typescript,
2121
}
2222

@@ -49,52 +49,6 @@ impl Opts {
4949
}
5050
}
5151

52-
fn expand_node_name<'a>(
53-
schema: &'a cw_schema::SchemaV1,
54-
node: &'a cw_schema::Node,
55-
) -> Cow<'a, str> {
56-
match node.value {
57-
cw_schema::NodeType::Array { items } => {
58-
let items = &schema.definitions[items];
59-
format!("Vec<{}>", expand_node_name(schema, items)).into()
60-
}
61-
cw_schema::NodeType::Float => "f32".into(),
62-
cw_schema::NodeType::Double => "f64".into(),
63-
cw_schema::NodeType::Boolean => "bool".into(),
64-
cw_schema::NodeType::String => "String".into(),
65-
cw_schema::NodeType::Integer { signed, precision } => {
66-
let ty = if signed { "i" } else { "u" };
67-
format!("{ty}{precision}").into()
68-
}
69-
cw_schema::NodeType::Binary => "Vec<u8>".into(),
70-
cw_schema::NodeType::Optional { inner } => {
71-
let inner = &schema.definitions[inner];
72-
format!("Option<{}>", expand_node_name(schema, inner)).into()
73-
}
74-
cw_schema::NodeType::Struct(..) => node.name.as_ref().into(),
75-
cw_schema::NodeType::Tuple { ref items } => {
76-
let items = items
77-
.iter()
78-
.map(|item| expand_node_name(schema, &schema.definitions[*item]))
79-
.collect::<Vec<_>>()
80-
.join(", ");
81-
82-
format!("({})", items).into()
83-
}
84-
cw_schema::NodeType::Enum { .. } => node.name.as_ref().into(),
85-
_ => todo!(),
86-
}
87-
}
88-
89-
fn prepare_docs(desc: Option<&str>) -> Cow<'_, [Cow<'_, str>]> {
90-
desc.map(|desc| {
91-
desc.lines()
92-
.map(|line| line.replace('"', "\\\"").into())
93-
.collect()
94-
})
95-
.unwrap_or(Cow::Borrowed(&[]))
96-
}
97-
9852
fn main() -> anyhow::Result<()> {
9953
simple_logger::SimpleLogger::new()
10054
.without_timestamps()
@@ -120,97 +74,10 @@ fn main() -> anyhow::Result<()> {
12074

12175
let mut output = opts.output()?;
12276

123-
schema.definitions.iter().for_each(|node| {
77+
schema.definitions.iter().try_for_each(|node| {
12478
debug!("Processing node: {node:?}");
125-
126-
match node.value {
127-
cw_schema::NodeType::Struct(ref sty) => {
128-
let structt = cw_schema_codegen::rust::StructTemplate {
129-
name: &node.name,
130-
docs: prepare_docs(node.description.as_deref()),
131-
ty: match sty {
132-
cw_schema::StructType::Unit => cw_schema_codegen::rust::TypeTemplate::Unit,
133-
cw_schema::StructType::Named { ref properties } => {
134-
cw_schema_codegen::rust::TypeTemplate::Named {
135-
fields: properties
136-
.iter()
137-
.map(|(name, prop)| {
138-
let ty = expand_node_name(
139-
&schema,
140-
&schema.definitions[prop.value],
141-
);
142-
cw_schema_codegen::rust::FieldTemplate {
143-
name: Cow::Borrowed(name),
144-
docs: prepare_docs(prop.description.as_deref()),
145-
ty,
146-
}
147-
})
148-
.collect(),
149-
}
150-
}
151-
_ => unreachable!(),
152-
},
153-
};
154-
155-
writeln!(output, "{structt}").unwrap();
156-
}
157-
cw_schema::NodeType::Enum { ref cases, .. } => {
158-
let enumm = cw_schema_codegen::rust::EnumTemplate {
159-
name: &node.name,
160-
docs: prepare_docs(node.description.as_deref()),
161-
variants: cases
162-
.iter()
163-
.map(
164-
|(name, case)| cw_schema_codegen::rust::EnumVariantTemplate {
165-
name,
166-
docs: prepare_docs(case.description.as_deref()),
167-
ty: match case.value {
168-
cw_schema::EnumValue::Unit => {
169-
cw_schema_codegen::rust::TypeTemplate::Unit
170-
}
171-
cw_schema::EnumValue::Tuple { ref items } => {
172-
let items = items
173-
.iter()
174-
.map(|item| {
175-
let node = &schema.definitions[*item];
176-
expand_node_name(&schema, node)
177-
})
178-
.collect();
179-
180-
cw_schema_codegen::rust::TypeTemplate::Tuple(items)
181-
}
182-
cw_schema::EnumValue::Named { ref properties, .. } => {
183-
cw_schema_codegen::rust::TypeTemplate::Named {
184-
fields: properties
185-
.iter()
186-
.map(|(name, prop)| {
187-
let ty = expand_node_name(
188-
&schema,
189-
&schema.definitions[prop.value],
190-
);
191-
cw_schema_codegen::rust::FieldTemplate {
192-
name: Cow::Borrowed(name),
193-
docs: prepare_docs(
194-
prop.description.as_deref(),
195-
),
196-
ty,
197-
}
198-
})
199-
.collect(),
200-
}
201-
}
202-
_ => unreachable!(),
203-
},
204-
},
205-
)
206-
.collect(),
207-
};
208-
209-
writeln!(output, "{enumm}").unwrap();
210-
}
211-
_ => (),
212-
}
213-
});
79+
cw_schema_codegen::rust::process_node(&mut output, &schema, node)
80+
})?;
21481

21582
Ok(())
21683
}
Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
use self::template::{
2+
EnumTemplate, EnumVariantTemplate, FieldTemplate, StructTemplate, TypeTemplate,
3+
};
4+
use std::{borrow::Cow, io};
5+
6+
pub mod template;
7+
8+
fn expand_node_name<'a>(
9+
schema: &'a cw_schema::SchemaV1,
10+
node: &'a cw_schema::Node,
11+
) -> Cow<'a, str> {
12+
match node.value {
13+
cw_schema::NodeType::Array { items } => {
14+
let items = &schema.definitions[items];
15+
format!("Vec<{}>", expand_node_name(schema, items)).into()
16+
}
17+
cw_schema::NodeType::Float => "f32".into(),
18+
cw_schema::NodeType::Double => "f64".into(),
19+
cw_schema::NodeType::Boolean => "bool".into(),
20+
cw_schema::NodeType::String => "String".into(),
21+
cw_schema::NodeType::Integer { signed, precision } => {
22+
let ty = if signed { "i" } else { "u" };
23+
format!("{ty}{precision}").into()
24+
}
25+
cw_schema::NodeType::Binary => "Vec<u8>".into(),
26+
cw_schema::NodeType::Optional { inner } => {
27+
let inner = &schema.definitions[inner];
28+
format!("Option<{}>", expand_node_name(schema, inner)).into()
29+
}
30+
cw_schema::NodeType::Struct(..) => node.name.as_ref().into(),
31+
cw_schema::NodeType::Tuple { ref items } => {
32+
let items = items
33+
.iter()
34+
.map(|item| expand_node_name(schema, &schema.definitions[*item]))
35+
.collect::<Vec<_>>()
36+
.join(", ");
37+
38+
format!("({})", items).into()
39+
}
40+
cw_schema::NodeType::Enum { .. } => node.name.as_ref().into(),
41+
_ => todo!(),
42+
}
43+
}
44+
45+
fn prepare_docs(desc: Option<&str>) -> Cow<'_, [Cow<'_, str>]> {
46+
desc.map(|desc| {
47+
desc.lines()
48+
.map(|line| line.replace('"', "\\\"").into())
49+
.collect()
50+
})
51+
.unwrap_or(Cow::Borrowed(&[]))
52+
}
53+
54+
pub fn process_node<O>(
55+
output: &mut O,
56+
schema: &cw_schema::SchemaV1,
57+
node: &cw_schema::Node,
58+
) -> io::Result<()>
59+
where
60+
O: io::Write,
61+
{
62+
match node.value {
63+
cw_schema::NodeType::Struct(ref sty) => {
64+
let structt = StructTemplate {
65+
name: &node.name,
66+
docs: prepare_docs(node.description.as_deref()),
67+
ty: match sty {
68+
cw_schema::StructType::Unit => TypeTemplate::Unit,
69+
cw_schema::StructType::Named { ref properties } => TypeTemplate::Named {
70+
fields: properties
71+
.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+
})
80+
.collect(),
81+
},
82+
_ => unreachable!(),
83+
},
84+
};
85+
86+
writeln!(output, "{structt}")?;
87+
}
88+
cw_schema::NodeType::Enum { ref cases, .. } => {
89+
let enumm = EnumTemplate {
90+
name: &node.name,
91+
docs: prepare_docs(node.description.as_deref()),
92+
variants: cases
93+
.iter()
94+
.map(|(name, case)| EnumVariantTemplate {
95+
name,
96+
docs: prepare_docs(case.description.as_deref()),
97+
ty: match case.value {
98+
cw_schema::EnumValue::Unit => TypeTemplate::Unit,
99+
cw_schema::EnumValue::Tuple { ref items } => {
100+
let items = items
101+
.iter()
102+
.map(|item| {
103+
let node = &schema.definitions[*item];
104+
expand_node_name(schema, node)
105+
})
106+
.collect();
107+
108+
TypeTemplate::Tuple(items)
109+
}
110+
cw_schema::EnumValue::Named { ref properties, .. } => {
111+
TypeTemplate::Named {
112+
fields: properties
113+
.iter()
114+
.map(|(name, prop)| {
115+
let ty = expand_node_name(
116+
schema,
117+
&schema.definitions[prop.value],
118+
);
119+
FieldTemplate {
120+
name: Cow::Borrowed(name),
121+
docs: prepare_docs(prop.description.as_deref()),
122+
ty,
123+
}
124+
})
125+
.collect(),
126+
}
127+
}
128+
_ => unreachable!(),
129+
},
130+
})
131+
.collect(),
132+
};
133+
134+
writeln!(output, "{enumm}")?;
135+
}
136+
_ => (),
137+
}
138+
139+
Ok(())
140+
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use std::borrow::Cow;
22

33
use askama::Template;
4-
use cw_schema_codegen::rust::{
4+
use cw_schema_codegen::rust::template::{
55
EnumTemplate, EnumVariantTemplate, FieldTemplate, StructTemplate, TypeTemplate,
66
};
77

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,15 @@
22
source: packages/cw-schema-codegen/tests/rust_tpl.rs
33
expression: rendered
44
---
5+
#[doc = "Complex enum"]
6+
7+
58
pub enum Complex {
69

10+
11+
#[doc = "One variant"]
12+
13+
714
One
815

916
(
@@ -14,12 +21,24 @@ pub enum Complex {
1421

1522
,
1623

24+
25+
#[doc = "Two variant"]
26+
27+
1728
Two
1829

1930
{
2031

32+
33+
#[doc = "Field a"]
34+
35+
2136
a: u64,
2237

38+
39+
#[doc = "Field b"]
40+
41+
2342
b: String,
2443

2544
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
source: packages/cw-schema-codegen/tests/rust_tpl.rs
33
expression: rendered
44
---
5+
#[doc = "Empty enum"]
6+
7+
58
pub enum Empty {
69

710
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
source: packages/cw-schema-codegen/tests/rust_tpl.rs
33
expression: rendered
44
---
5+
#[doc = "Empty struct"]
6+
7+
58
pub struct Empty
69

710

0 commit comments

Comments
 (0)