|
| 1 | +use crate::types::{EfiVariable, EfiVariableAttribute}; |
| 2 | +use std::fmt; |
| 3 | + |
| 4 | +pub struct Verbose<'a>(pub &'a EfiVariable<'a>); |
| 5 | + |
| 6 | +impl fmt::Display for Verbose<'_> { |
| 7 | + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
| 8 | + f.write_str(&format!("GUID: {}\n", self.0.guid))?; |
| 9 | + f.write_str(&format!("Name: \"{}\"\n", self.0.name))?; |
| 10 | + f.write_str("Attributes:\n")?; |
| 11 | + let mut sorted_attrs: Vec<&EfiVariableAttribute> = |
| 12 | + self.0.attributes.clone().into_iter().collect(); |
| 13 | + sorted_attrs.sort_unstable_by(|a1, a2| <u32>::from(*a1).cmp(&<u32>::from(*a2))); |
| 14 | + for a in sorted_attrs.iter() { |
| 15 | + f.write_str(&format!("\t{}\n", String::from(*a)))?; |
| 16 | + } |
| 17 | + |
| 18 | + f.write_str("Value:\n")?; |
| 19 | + for i in (0..self.0.data.len()).step_by(16) { |
| 20 | + f.write_str(&format!("{:08x} ", i))?; |
| 21 | + |
| 22 | + let mut decode: [u8; 16] = [0; 16]; |
| 23 | + let mut line_iter = self.0.data.iter().skip(i); |
| 24 | + for j in i..i + 16 { |
| 25 | + match line_iter.next() { |
| 26 | + Some(c) => { |
| 27 | + if (0x20 < *c) && (*c < 0x7e) { |
| 28 | + decode[j - i] = u32::from(*c) as u8; |
| 29 | + } else { |
| 30 | + decode[j - i] = u32::from('.') as u8; |
| 31 | + } |
| 32 | + if j < i + 8 { |
| 33 | + f.write_str(&format!("{:02x} ", u8::from(*c)))?; |
| 34 | + } else { |
| 35 | + f.write_str(&format!(" {:02x}", u8::from(*c)))?; |
| 36 | + } |
| 37 | + } |
| 38 | + None => { |
| 39 | + decode[j - i] = u32::from(' ') as u8; |
| 40 | + f.write_str(" ")?; |
| 41 | + } |
| 42 | + }; |
| 43 | + } |
| 44 | + f.write_str(&format!(" |{}|\n", std::str::from_utf8(&decode).unwrap()))?; |
| 45 | + } |
| 46 | + f.write_str(&format!("{:08x}\n", self.0.data.len()))?; |
| 47 | + return Ok(()); |
| 48 | + } |
| 49 | +} |
0 commit comments