efivarcli 2.0.0

EFI boot manager variable editor written in Rust
use crate::exit_code::ExitCode;

use itertools::Itertools;

use efivar::{
    efi::{Variable, VariableVendor},
    VarManager,
};

pub fn run(
    reader: &dyn VarManager,
    name: &str,
    namespace: Option<uuid::Uuid>,
    as_string: bool,
    raw: bool,
) -> ExitCode {
    let name = Variable::new_with_vendor(
        name,
        namespace.map_or(VariableVendor::Efi, VariableVendor::Custom),
    );

    match reader.read(&name) {
        Ok((buf, attr)) => {
            if !raw {
                println!("Attributes: {}", attr.to_string());
            }
            if as_string {
                if raw {
                    println!("{}", String::from_utf8_lossy(&buf));
                } else {
                    println!("Value (as UTF8 string): {}", String::from_utf8_lossy(&buf));
                }
            } else {
                let value = buf
                    .iter()
                    .tuples()
                    .map(|(a, b)| format!("{:02X}{:02X}", a, b))
                    .fold(String::new(), |acc, ref item| acc + " " + item)
                    .trim()
                    .to_owned();
                if raw {
                    println!("{}", value);
                } else {
                    println!("Value: {}", value);
                }
            };
            ExitCode::SUCCESS
        }
        Err(reason) => {
            eprintln!("Failed: {}", reason);
            ExitCode::FAILURE
        }
    }
}