mirror of
https://github.com/a2x/cs2-dumper.git
synced 2025-09-18 12:50:01 +08:00
Handle empty names and duplicate values in Rust generator
This commit is contained in:
@@ -89,6 +89,10 @@ fn read_class_binding(
|
||||
|
||||
let name = binding.name.read_string(process)?.to_string();
|
||||
|
||||
if name.is_empty() {
|
||||
return Err(Error::Other("empty class name"));
|
||||
}
|
||||
|
||||
let parent = binding.base_classes.non_null().and_then(|ptr| {
|
||||
let base_class = ptr.read(process).ok()?;
|
||||
let parent_class = base_class.prev.read(process).ok()?;
|
||||
@@ -215,6 +219,10 @@ fn read_enum_binding(
|
||||
let binding = binding_ptr.read(process)?;
|
||||
let name = binding.name.read_string(process)?.to_string();
|
||||
|
||||
if name.is_empty() {
|
||||
return Err(Error::Other("empty enum name"));
|
||||
}
|
||||
|
||||
let members = read_enum_binding_members(process, &binding)?;
|
||||
|
||||
debug!(
|
||||
|
@@ -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 {
|
||||
|
@@ -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,
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
|
@@ -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())?;
|
||||
|
Reference in New Issue
Block a user