fmd-adm 0.2.0

Idiomatic Rust bindings for illumos libfmd_adm
Documentation
use fmd_adm::{FmdAdm, NvValue};

fn main() {
    let adm = FmdAdm::open().expect("failed to open fmd adm handle");

    println!("=== FMD Modules ===");
    let modules = adm.modules().expect("failed to list modules");
    for m in &modules {
        println!(
            "  {} v{} - {}{}",
            m.name,
            m.version,
            m.description,
            if m.failed { " [FAILED]" } else { "" },
        );
    }
    println!("({} modules total)", modules.len());

    println!("\n=== Faulty Resources ===");
    let resources = adm.resources(true).expect("failed to list resources");
    if resources.is_empty() {
        println!("  (none)");
    } else {
        for r in &resources {
            println!("  {} (case {})", r.fmri, r.uuid);
        }
    }

    println!("\n=== Cases ===");
    let cases = adm.cases(None).expect("failed to list cases");
    if cases.is_empty() {
        println!("  (none)");
    } else {
        for c in &cases {
            let severity = c
                .event
                .as_ref()
                .and_then(|e| e.lookup("severity"))
                .and_then(|v| match v {
                    NvValue::String(s) => Some(s.as_str()),
                    _ => None,
                })
                .unwrap_or("unknown");
            println!("  {} - {} (severity: {})", c.uuid, c.code, severity);
        }
    }
}