cs2-dumper/src/output/interfaces.rs
a2x 7933103b03 0.1.2
* Updated for memflow 0.2.2
* Replaced periods with underscores in generated file names for easier inclusion
* Program execution now continues if analysis fails at any point
* Removed custom error type in favor of anyhow
* Added logging to cs2-dumper.log
* Now compilable on Linux
2024-07-30 02:07:40 +10:00

98 lines
3.1 KiB
Rust

use std::collections::BTreeMap;
use std::fmt::{self, Write};
use heck::{AsPascalCase, AsSnakeCase};
use super::{slugify, CodeWriter, Formatter, InterfaceMap};
impl CodeWriter for InterfaceMap {
fn write_cs(&self, fmt: &mut Formatter<'_>) -> fmt::Result {
fmt.block("namespace CS2Dumper.Interfaces", false, |fmt| {
for (module_name, ifaces) in self {
writeln!(fmt, "// Module: {}", module_name)?;
fmt.block(
&format!("public static class {}", AsPascalCase(slugify(module_name))),
false,
|fmt| {
for (name, value) in ifaces {
writeln!(fmt, "public const nint {} = {:#X};", name, value)?;
}
Ok(())
},
)?;
}
Ok(())
})
}
fn write_hpp(&self, fmt: &mut Formatter<'_>) -> fmt::Result {
writeln!(fmt, "#pragma once\n")?;
writeln!(fmt, "#include <cstddef>\n")?;
fmt.block("namespace cs2_dumper", false, |fmt| {
fmt.block("namespace interfaces", false, |fmt| {
for (module_name, ifaces) in self {
writeln!(fmt, "// Module: {}", module_name)?;
fmt.block(
&format!("namespace {}", AsSnakeCase(slugify(module_name))),
false,
|fmt| {
for (name, value) in ifaces {
writeln!(fmt, "constexpr std::ptrdiff_t {} = {:#X};", name, value)?;
}
Ok(())
},
)?;
}
Ok(())
})
})
}
fn write_json(&self, fmt: &mut Formatter<'_>) -> fmt::Result {
let content: BTreeMap<_, _> = self
.iter()
.map(|(module_name, ifaces)| {
let ifaces: BTreeMap<_, _> =
ifaces.iter().map(|(name, value)| (name, value)).collect();
(module_name, ifaces)
})
.collect();
fmt.write_str(&serde_json::to_string_pretty(&content).unwrap())
}
fn write_rs(&self, fmt: &mut Formatter<'_>) -> fmt::Result {
writeln!(fmt, "#![allow(non_upper_case_globals, unused)]\n")?;
fmt.block("pub mod cs2_dumper", false, |fmt| {
fmt.block("pub mod interfaces", false, |fmt| {
for (module_name, ifaces) in self {
writeln!(fmt, "// Module: {}", module_name)?;
fmt.block(
&format!("pub mod {}", AsSnakeCase(slugify(module_name))),
false,
|fmt| {
for (name, value) in ifaces {
writeln!(fmt, "pub const {}: usize = {:#X};", name, value)?;
}
Ok(())
},
)?;
}
Ok(())
})
})
}
}