Skip to content

Commit 0869ce6

Browse files
committed
Fold pyclass enums into planus enums
1 parent 78b3e48 commit 0869ce6

55 files changed

Lines changed: 571 additions & 1606 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

codegen/class_inject.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,16 @@ pub fn classes_to_lib_rs(mut class_names: Vec<&str>) -> io::Result<()> {
2222

2323
Ok(())
2424
}
25+
26+
pub fn add_pyclass_to_planus_enum(file: &mut String, name: &str) {
27+
let find_str = format!("pub enum {name} {{");
28+
let file_pos = file.find(&find_str).unwrap();
29+
let end_pos = file_pos + find_str.len();
30+
let start_pos = file[..file_pos].rfind("#[derive").unwrap();
31+
file.replace_range(
32+
start_pos..end_pos,
33+
&format!(
34+
"#[derive(Copy, Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]\n#[repr(u8)]\n#[::pyo3::pyclass(module = \"rlbot_flatbuffers\", from_py_object, frozen, hash, eq, eq_int)]\n{find_str}#[default]"
35+
)
36+
);
37+
}

codegen/enums.rs

Lines changed: 2 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -95,67 +95,6 @@ impl<'a> EnumBindGenerator<'a> {
9595
}
9696
}
9797

98-
fn generate_definition(&mut self) {
99-
write_str!(
100-
self,
101-
"#[derive(Debug, Default, Clone, PartialEq, Eq, Hash)]"
102-
);
103-
write_str!(
104-
self,
105-
"#[pyclass(module = \"rlbot_flatbuffers\", from_py_object, frozen, hash, eq, eq_int)]"
106-
);
107-
write_fmt!(self, "pub enum {} {{", self.name);
108-
write_str!(self, " #[default]");
109-
110-
for (var_num, var_info) in self.variants {
111-
write_fmt!(self, " {} = {var_num},", normalize_caps(&var_info.name));
112-
}
113-
114-
write_str!(self, "}");
115-
write_str!(self, "");
116-
}
117-
118-
fn generate_from_flat_impls(&mut self) {
119-
write_fmt!(self, "impl From<flat::{}> for {} {{", self.name, self.name);
120-
write_fmt!(self, " fn from(flat_t: flat::{}) -> Self {{", self.name);
121-
write_str!(self, " match flat_t {");
122-
123-
for var_info in self.variants.values() {
124-
let var_name = normalize_caps(&var_info.name);
125-
write_fmt!(
126-
self,
127-
" flat::{}::{var_name} => Self::{var_name},",
128-
self.name
129-
);
130-
}
131-
132-
write_str!(self, " }");
133-
write_str!(self, " }");
134-
write_str!(self, "}");
135-
write_str!(self, "");
136-
}
137-
138-
fn generate_to_flat_impls(&mut self) {
139-
write_fmt!(self, "impl From<&{}> for flat::{} {{", self.name, self.name);
140-
write_fmt!(self, " fn from(py_type: &{}) -> Self {{", self.name);
141-
write_str!(self, " match py_type {");
142-
143-
for var_info in self.variants.values() {
144-
let var_name = normalize_caps(&var_info.name);
145-
write_fmt!(
146-
self,
147-
" {}::{var_name} => Self::{var_name},",
148-
self.name,
149-
);
150-
}
151-
152-
write_str!(self, " }");
153-
write_str!(self, " }");
154-
write_str!(self, "}");
155-
156-
write_str!(self, "");
157-
}
158-
15998
fn generate_new_method(&mut self) {
16099
write_str!(self, " #[new]");
161100
assert!(u8::try_from(self.variants.len()).is_ok());
@@ -216,10 +155,9 @@ impl<'a> EnumBindGenerator<'a> {
216155
"use pyo3::{PyResult, exceptions::PyValueError, pyclass, pymethods};"
217156
);
218157
write_str!(self, "");
158+
write_fmt!(self, "pub use flat::{};", self.name);
159+
write_str!(self, "");
219160

220-
self.generate_definition();
221-
self.generate_from_flat_impls();
222-
self.generate_to_flat_impls();
223161
self.generate_py_methods();
224162

225163
self.file_contents

codegen/main.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ use std::{
1111
};
1212

1313
use crate::{
14-
enums::EnumBindGenerator, structs::StructBindGenerator, table::TableBindGenerator,
15-
unions::UnionBindGenerator,
14+
class_inject::add_pyclass_to_planus_enum, enums::EnumBindGenerator,
15+
structs::StructBindGenerator, table::TableBindGenerator, unions::UnionBindGenerator,
1616
};
1717

1818
mod class_inject;
@@ -274,6 +274,13 @@ fn main() -> eyre::Result<()> {
274274
.replace("::serde::Serialize,", "")
275275
.replace("::serde::Deserialize,", "");
276276

277+
for (_, full_type_name, item) in declarations.iter_declarations() {
278+
if let DeclarationKind::Enum(_) = &item.kind {
279+
let type_name = full_type_name.0.last().unwrap();
280+
add_pyclass_to_planus_enum(&mut generated_planus, type_name);
281+
}
282+
}
283+
277284
fs::write(OUT_FILE, format_string(&generated_planus)?.as_bytes())?;
278285

279286
class_inject::classes_to_lib_rs(class_names)?;

codegen/table.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ impl<'a> TableBindGenerator<'a> {
211211
}
212212
},
213213
SimpleType::Enum(_) => {
214-
format!("flat_t.{field_name}.into()")
214+
format!("flat_t.{field_name}")
215215
}
216216
},
217217
TypeKind::String => match field_info.assign_mode {
@@ -323,7 +323,7 @@ impl<'a> TableBindGenerator<'a> {
323323
}
324324
},
325325
SimpleType::Enum(_) => {
326-
format!("(&py_type.{field_name}).into()")
326+
format!("py_type.{field_name}")
327327
}
328328
},
329329
TypeKind::String => match field_info.assign_mode {

0 commit comments

Comments
 (0)