From 90bed438807d80ad6510f2e9247475b0f986594d Mon Sep 17 00:00:00 2001 From: Roms1383 Date: Sat, 18 Apr 2026 12:13:58 +0700 Subject: [PATCH 1/5] feat: TDBID ToStringDEBUG --- src/types/id/tweak_db_id.rs | 38 ++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/src/types/id/tweak_db_id.rs b/src/types/id/tweak_db_id.rs index a161fb6c..983af77f 100644 --- a/src/types/id/tweak_db_id.rs +++ b/src/types/id/tweak_db_id.rs @@ -1,8 +1,9 @@ -use std::fmt::Debug; +use std::fmt::{Debug, Display}; use std::hash::Hash; use const_crc32::{crc32, crc32_seed}; +use crate::InvokeError; use crate::raw::root::RED4ext as red; #[derive(Default, Clone, Copy)] @@ -76,6 +77,32 @@ impl TweakDbId { pub(super) const fn to_inner(self) -> red::TweakDBID { self.0 } + + /// Available post RTTI registration. + /// + /// see [TDBID.ToStringDEBUG](https://nativedb.red4ext.com/gamedataTDBIDHelper#ToStringDEBUG) + #[cfg(not(test))] + pub fn to_string_debug(&self) -> Result { + const CLS_NAME: &str = "gamedataTDBIDHelper"; + const FUN_NAME: &str = "ToStringDEBUG"; + const FUN_CNAME: crate::types::CName = crate::types::CName::new(FUN_NAME); + let rtti = crate::RttiSystem::get(); + let class = rtti + .get_class(crate::types::CName::new(CLS_NAME)) + .ok_or(InvokeError::ClassNotFound(CLS_NAME))?; + let method = class + .methods() + .iter() + .find(|x| x.as_function().name() == FUN_CNAME) + .ok_or(InvokeError::FunctionNotFound(FUN_NAME))?; + let mut out = crate::types::RedString::new(); + let out_ptr = &raw mut out; + let out_ptr = unsafe { &*out_ptr.cast::() }; + method + .as_function() + .execute::<_, crate::types::RedString>(Some(out_ptr), (*self,)) + .map(|x| x.to_string()) + } } impl Debug for TweakDbId { @@ -86,6 +113,15 @@ impl Debug for TweakDbId { } } +impl Display for TweakDbId { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + if let Ok(id) = self.to_string_debug() { + return write!(f, "{id}"); + } + std::fmt::Result::Ok(()) + } +} + impl PartialEq for TweakDbId { fn eq(&self, other: &Self) -> bool { u64::from(*self).eq(&u64::from(*other)) From 9de59565bc61a7fea008aad470ea6ff7df64b70b Mon Sep 17 00:00:00 2001 From: Roms1383 Date: Sat, 18 Apr 2026 12:29:07 +0700 Subject: [PATCH 2/5] fix: cfg --- src/types/id/tweak_db_id.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/types/id/tweak_db_id.rs b/src/types/id/tweak_db_id.rs index 983af77f..a4a1abf3 100644 --- a/src/types/id/tweak_db_id.rs +++ b/src/types/id/tweak_db_id.rs @@ -113,6 +113,7 @@ impl Debug for TweakDbId { } } +#[cfg(not(test))] impl Display for TweakDbId { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { if let Ok(id) = self.to_string_debug() { From 3cc6d5c00ecce59c69d84d82c6039b6938fde475 Mon Sep 17 00:00:00 2001 From: Roms1383 Date: Sat, 18 Apr 2026 12:56:29 +0700 Subject: [PATCH 3/5] style: imports --- src/types/id/tweak_db_id.rs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/types/id/tweak_db_id.rs b/src/types/id/tweak_db_id.rs index a4a1abf3..96893492 100644 --- a/src/types/id/tweak_db_id.rs +++ b/src/types/id/tweak_db_id.rs @@ -1,9 +1,8 @@ -use std::fmt::{Debug, Display}; +use std::fmt::Debug; use std::hash::Hash; use const_crc32::{crc32, crc32_seed}; -use crate::InvokeError; use crate::raw::root::RED4ext as red; #[derive(Default, Clone, Copy)] @@ -89,12 +88,12 @@ impl TweakDbId { let rtti = crate::RttiSystem::get(); let class = rtti .get_class(crate::types::CName::new(CLS_NAME)) - .ok_or(InvokeError::ClassNotFound(CLS_NAME))?; + .ok_or(crate::InvokeError::ClassNotFound(CLS_NAME))?; let method = class .methods() .iter() .find(|x| x.as_function().name() == FUN_CNAME) - .ok_or(InvokeError::FunctionNotFound(FUN_NAME))?; + .ok_or(crate::InvokeError::FunctionNotFound(FUN_NAME))?; let mut out = crate::types::RedString::new(); let out_ptr = &raw mut out; let out_ptr = unsafe { &*out_ptr.cast::() }; @@ -114,7 +113,7 @@ impl Debug for TweakDbId { } #[cfg(not(test))] -impl Display for TweakDbId { +impl std::fmt::Display for TweakDbId { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { if let Ok(id) = self.to_string_debug() { return write!(f, "{id}"); From 744b80271eec51fcc0bc17a2f78431a5d007c53d Mon Sep 17 00:00:00 2001 From: Roms1383 Date: Sat, 18 Apr 2026 12:59:01 +0700 Subject: [PATCH 4/5] chore: blank impl to avoid conditional compilation downstream --- src/types/id/tweak_db_id.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/types/id/tweak_db_id.rs b/src/types/id/tweak_db_id.rs index 96893492..fe86baa4 100644 --- a/src/types/id/tweak_db_id.rs +++ b/src/types/id/tweak_db_id.rs @@ -112,6 +112,13 @@ impl Debug for TweakDbId { } } +#[cfg(test)] +impl std::fmt::Display for TweakDbId { + fn fmt(&self, _: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + std::fmt::Result::Ok(()) + } +} + #[cfg(not(test))] impl std::fmt::Display for TweakDbId { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { From 5eddf83613107a3a5e30aa0ed411e88069d6ba96 Mon Sep 17 00:00:00 2001 From: Roms1383 Date: Sat, 18 Apr 2026 13:07:59 +0700 Subject: [PATCH 5/5] refactor: simplify --- src/types/id/tweak_db_id.rs | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/src/types/id/tweak_db_id.rs b/src/types/id/tweak_db_id.rs index fe86baa4..b268e40c 100644 --- a/src/types/id/tweak_db_id.rs +++ b/src/types/id/tweak_db_id.rs @@ -112,18 +112,11 @@ impl Debug for TweakDbId { } } -#[cfg(test)] impl std::fmt::Display for TweakDbId { - fn fmt(&self, _: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Result::Ok(()) - } -} - -#[cfg(not(test))] -impl std::fmt::Display for TweakDbId { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + fn fmt(&self, _f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + #[cfg(not(test))] if let Ok(id) = self.to_string_debug() { - return write!(f, "{id}"); + return write!(_f, "{id}"); } std::fmt::Result::Ok(()) }