Initial import of rusticata-macros-3.1.0

Bug: 193833713
Change-Id: I8c64a1f7a387fb4162d80d201b1cfcd7172ed0f3
diff --git a/src/debug.rs b/src/debug.rs
new file mode 100644
index 0000000..eb4e821
--- /dev/null
+++ b/src/debug.rs
@@ -0,0 +1,54 @@
+//! Helper functions and structures for debugging purpose
+
+use std::fmt;
+
+/// Wrapper for printing value as u8 hex data
+pub struct HexU8(pub u8);
+
+impl fmt::Debug for HexU8 {
+    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
+        write!(fmt, "0x{:02x}", self.0)
+    }
+}
+
+/// Wrapper for printing value as u16 hex data
+pub struct HexU16(pub u16);
+
+impl fmt::Debug for HexU16 {
+    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
+        write!(fmt, "0x{:04x}", self.0)
+    }
+}
+
+/// Wrapper for printing slice as hex data
+pub struct HexSlice<'a>(pub &'a [u8]);
+
+impl<'a> fmt::Debug for HexSlice<'a> {
+    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
+        let s: Vec<_> = self.0.iter().map(|&i| format!("{:02x}", i)).collect();
+        write!(fmt, "[{}]", s.join(" "))
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use crate::debug;
+
+    #[test]
+    fn debug_print_hexu8() {
+        assert_eq!(format!("{:?}", debug::HexU8(18)), "0x12");
+    }
+
+    #[test]
+    fn debug_print_hexu16() {
+        assert_eq!(format!("{:?}", debug::HexU16(32769)), "0x8001");
+    }
+
+    #[test]
+    fn debug_print_hexslice() {
+        assert_eq!(
+            format!("{:?}", debug::HexSlice(&[15, 16, 17, 18, 19, 20])),
+            "[0f 10 11 12 13 14]"
+        );
+    }
+}