Skip to content

Commit e790303

Browse files
committed
[Rust] Add Display and Debug impl to Metadata
1 parent 7818772 commit e790303

File tree

1 file changed

+78
-0
lines changed

1 file changed

+78
-0
lines changed

rust/src/metadata.rs

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use crate::rc::{Array, CoreArrayProvider, CoreArrayProviderInner, Guard, Ref, Re
22
use crate::string::{raw_to_string, BnString, IntoCStr, IntoJson};
33
use binaryninjacore_sys::*;
44
use std::collections::HashMap;
5+
use std::fmt::{Debug, Display, Formatter};
56
use std::os::raw::c_char;
67
use std::slice;
78

@@ -311,6 +312,83 @@ impl Metadata {
311312
}
312313
}
313314

315+
impl Debug for Metadata {
316+
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
317+
f.debug_struct("Metadata")
318+
.field("type", &self.get_type())
319+
.field("len", &self.len())
320+
// Display will give you the metadata value as a string.
321+
.field("value", &self.to_string())
322+
.finish()
323+
}
324+
}
325+
326+
impl Display for Metadata {
327+
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
328+
// Display will give you the metadata value as a string.
329+
match self.get_type() {
330+
MetadataType::BooleanDataType => match self.get_boolean() {
331+
Some(val) => write!(f, "{}", val),
332+
None => write!(f, "null"),
333+
},
334+
MetadataType::UnsignedIntegerDataType => match self.get_unsigned_integer() {
335+
Some(val) => write!(f, "{}", val),
336+
None => write!(f, "null"),
337+
},
338+
MetadataType::SignedIntegerDataType => match self.get_signed_integer() {
339+
Some(val) => write!(f, "{}", val),
340+
None => write!(f, "null"),
341+
},
342+
MetadataType::DoubleDataType => match self.get_double() {
343+
Some(val) => write!(f, "{}", val),
344+
None => write!(f, "null"),
345+
},
346+
MetadataType::StringDataType => match self.get_string() {
347+
Some(val) => write!(f, "{}", val.to_string_lossy()),
348+
None => write!(f, "null"),
349+
},
350+
MetadataType::ArrayDataType => {
351+
match self.get_array() {
352+
Some(array) => {
353+
// TODO: This is extremely ugly
354+
write!(f, "[")?;
355+
for (i, val) in array.iter().enumerate() {
356+
if i > 0 {
357+
write!(f, ", ")?;
358+
}
359+
write!(f, "{}", *val)?;
360+
}
361+
write!(f, "]")?;
362+
Ok(())
363+
}
364+
None => write!(f, "null"),
365+
}
366+
}
367+
MetadataType::InvalidDataType => {
368+
write!(f, "null")
369+
}
370+
MetadataType::KeyValueDataType => match self.get_value_store() {
371+
Some(map) => {
372+
write!(f, "{{")?;
373+
for (i, (key, val)) in map.iter().enumerate() {
374+
if i > 0 {
375+
write!(f, ", ")?;
376+
}
377+
write!(f, "{}: {}", key, val)?;
378+
}
379+
write!(f, "}}")?;
380+
Ok(())
381+
}
382+
None => write!(f, "null"),
383+
},
384+
MetadataType::RawDataType => match self.get_raw() {
385+
Some(val) => write!(f, "{:x?}", val),
386+
None => write!(f, "null"),
387+
},
388+
}
389+
}
390+
}
391+
314392
unsafe impl Sync for Metadata {}
315393
unsafe impl Send for Metadata {}
316394

0 commit comments

Comments
 (0)