summaryrefslogtreecommitdiff
path: root/rust/src
diff options
context:
space:
mode:
authorMason Reed <mason@vector35.com>2025-05-12 15:55:35 -0400
committerMason Reed <35282038+emesare@users.noreply.github.com>2025-05-12 17:45:24 -0400
commit84390f7ec536f4d8957dc38ec862446dcb8fda20 (patch)
treec13de182123441a7ff8811dc09088aca21e968ff /rust/src
parent0529ae4102f7dc37f54928bb4249ac74965b1ff4 (diff)
[Rust] Add `Display` and `Debug` impl to `Metadata`
Diffstat (limited to 'rust/src')
-rw-r--r--rust/src/metadata.rs78
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 {}