Handle empty names and duplicate values in Rust generator

This commit is contained in:
a2x
2024-05-24 21:03:42 +10:00
parent 3f6c894097
commit 09413db57a
68 changed files with 101 additions and 190 deletions

View File

@@ -53,7 +53,7 @@ impl CodeWriter for Vec<Button> {
BTreeMap::from_iter([("client.dll", buttons)])
};
fmt.write_str(&serde_json::to_string_pretty(&content).expect("failed to serialize"))
fmt.write_str(&serde_json::to_string_pretty(&content).expect("unable to serialize json"))
}
fn write_rs(&self, fmt: &mut Formatter<'_>) -> fmt::Result {

View File

@@ -15,6 +15,7 @@ impl<'a> Formatter<'a> {
}
}
// TODO: Refactor this.
pub fn block<F>(&mut self, heading: &str, semicolon: bool, f: F) -> fmt::Result
where
F: FnOnce(&mut Self) -> fmt::Result,

View File

@@ -40,11 +40,8 @@ impl<'a> Item<'a> {
trait CodeWriter {
fn write_cs(&self, fmt: &mut Formatter<'_>) -> fmt::Result;
fn write_hpp(&self, fmt: &mut Formatter<'_>) -> fmt::Result;
fn write_json(&self, fmt: &mut Formatter<'_>) -> fmt::Result;
fn write_rs(&self, fmt: &mut Formatter<'_>) -> fmt::Result;
}

View File

@@ -1,4 +1,4 @@
use std::collections::BTreeMap;
use std::collections::{BTreeMap, HashSet};
use std::fmt::{self, Write};
use heck::{AsPascalCase, AsSnakeCase};
@@ -37,8 +37,6 @@ impl CodeWriter for SchemaMap {
&format!("public enum {} : {}", slugify(&enum_.name), type_name),
false,
|fmt| {
// TODO: Handle the case where multiple members share
// the same value.
let members = enum_
.members
.iter()
@@ -58,7 +56,7 @@ impl CodeWriter for SchemaMap {
.parent
.as_ref()
.map(|parent| slugify(&parent.name))
.unwrap_or_else(|| "None".to_string());
.unwrap_or_else(|| String::from("None"));
writeln!(fmt, "// Parent: {}", parent_name)?;
writeln!(fmt, "// Fields count: {}", class.fields.len())?;
@@ -122,8 +120,6 @@ impl CodeWriter for SchemaMap {
&format!("enum class {} : {}", slugify(&enum_.name), type_name),
true,
|fmt| {
// TODO: Handle the case where multiple members share
// the same value.
let members = enum_
.members
.iter()
@@ -143,7 +139,7 @@ impl CodeWriter for SchemaMap {
.parent
.as_ref()
.map(|parent| slugify(&parent.name))
.unwrap_or_else(|| "None".to_string());
.unwrap_or_else(|| String::from("None"));
writeln!(fmt, "// Parent: {}", parent_name)?;
writeln!(fmt, "// Fields count: {}", class.fields.len())?;
@@ -299,21 +295,24 @@ impl CodeWriter for SchemaMap {
),
false,
|fmt| {
// TODO: Handle the case where multiple members share
// the same value.
let mut used_values = HashSet::new();
let members = enum_
.members
.iter()
.map(|member| {
format!(
"{} = {}",
member.name,
if member.value == -1 {
.filter_map(|member| {
// Filter out duplicate values.
if used_values.insert(member.value) {
let value = if member.value == -1 {
format!("{}::MAX", type_name)
} else {
format!("{:#X}", member.value)
}
)
};
Some(format!("{} = {}", member.name, value))
} else {
None
}
})
.collect::<Vec<_>>()
.join(",\n");
@@ -328,7 +327,7 @@ impl CodeWriter for SchemaMap {
.parent
.as_ref()
.map(|parent| slugify(&parent.name))
.unwrap_or_else(|| "None".to_string());
.unwrap_or_else(|| String::from("None"));
writeln!(fmt, "// Parent: {}", parent_name)?;
writeln!(fmt, "// Fields count: {}", class.fields.len())?;