diff options
| author | Mason Reed <mason@vector35.com> | 2025-05-12 15:55:35 -0400 |
|---|---|---|
| committer | Mason Reed <35282038+emesare@users.noreply.github.com> | 2025-05-12 17:45:24 -0400 |
| commit | 84390f7ec536f4d8957dc38ec862446dcb8fda20 (patch) | |
| tree | c13de182123441a7ff8811dc09088aca21e968ff /rust/src | |
| parent | 0529ae4102f7dc37f54928bb4249ac74965b1ff4 (diff) | |
[Rust] Add `Display` and `Debug` impl to `Metadata`
Diffstat (limited to 'rust/src')
| -rw-r--r-- | rust/src/metadata.rs | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/rust/src/metadata.rs b/rust/src/metadata.rs index e541577d..b6a88eef 100644 --- a/rust/src/metadata.rs +++ b/rust/src/metadata.rs @@ -2,6 +2,7 @@ use crate::rc::{Array, CoreArrayProvider, CoreArrayProviderInner, Guard, Ref, Re use crate::string::{raw_to_string, BnString, IntoCStr, IntoJson}; use binaryninjacore_sys::*; use std::collections::HashMap; +use std::fmt::{Debug, Display, Formatter}; use std::os::raw::c_char; use std::slice; @@ -311,6 +312,83 @@ impl Metadata { } } +impl Debug for Metadata { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + f.debug_struct("Metadata") + .field("type", &self.get_type()) + .field("len", &self.len()) + // Display will give you the metadata value as a string. + .field("value", &self.to_string()) + .finish() + } +} + +impl Display for Metadata { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + // Display will give you the metadata value as a string. + match self.get_type() { + MetadataType::BooleanDataType => match self.get_boolean() { + Some(val) => write!(f, "{}", val), + None => write!(f, "null"), + }, + MetadataType::UnsignedIntegerDataType => match self.get_unsigned_integer() { + Some(val) => write!(f, "{}", val), + None => write!(f, "null"), + }, + MetadataType::SignedIntegerDataType => match self.get_signed_integer() { + Some(val) => write!(f, "{}", val), + None => write!(f, "null"), + }, + MetadataType::DoubleDataType => match self.get_double() { + Some(val) => write!(f, "{}", val), + None => write!(f, "null"), + }, + MetadataType::StringDataType => match self.get_string() { + Some(val) => write!(f, "{}", val.to_string_lossy()), + None => write!(f, "null"), + }, + MetadataType::ArrayDataType => { + match self.get_array() { + Some(array) => { + // TODO: This is extremely ugly + write!(f, "[")?; + for (i, val) in array.iter().enumerate() { + if i > 0 { + write!(f, ", ")?; + } + write!(f, "{}", *val)?; + } + write!(f, "]")?; + Ok(()) + } + None => write!(f, "null"), + } + } + MetadataType::InvalidDataType => { + write!(f, "null") + } + MetadataType::KeyValueDataType => match self.get_value_store() { + Some(map) => { + write!(f, "{{")?; + for (i, (key, val)) in map.iter().enumerate() { + if i > 0 { + write!(f, ", ")?; + } + write!(f, "{}: {}", key, val)?; + } + write!(f, "}}")?; + Ok(()) + } + None => write!(f, "null"), + }, + MetadataType::RawDataType => match self.get_raw() { + Some(val) => write!(f, "{:x?}", val), + None => write!(f, "null"), + }, + } + } +} + unsafe impl Sync for Metadata {} unsafe impl Send for Metadata {} |
