@@ -2,6 +2,7 @@ use crate::rc::{Array, CoreArrayProvider, CoreArrayProviderInner, Guard, Ref, Re
22use crate :: string:: { raw_to_string, BnString , IntoCStr , IntoJson } ;
33use binaryninjacore_sys:: * ;
44use std:: collections:: HashMap ;
5+ use std:: fmt:: { Debug , Display , Formatter } ;
56use std:: os:: raw:: c_char;
67use 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+
314392unsafe impl Sync for Metadata { }
315393unsafe impl Send for Metadata { }
316394
0 commit comments