sysctl 0.3.0

Simplified interface to libc::sysctl
Documentation
extern crate sysctl;
use std::env;

fn format_value(value: sysctl::CtlValue) -> String {
    match value {
        sysctl::CtlValue::None => "(none)".to_owned(),
        sysctl::CtlValue::Int(i) => format!("{}", i),
        sysctl::CtlValue::Uint(i) => format!("{}", i),
        sysctl::CtlValue::Long(i) => format!("{}", i),
        sysctl::CtlValue::Ulong(i) => format!("{}", i),
        sysctl::CtlValue::U8(i) => format!("{}", i),
        sysctl::CtlValue::U16(i) => format!("{}", i),
        sysctl::CtlValue::U32(i) => format!("{}", i),
        sysctl::CtlValue::U64(i) => format!("{}", i),
        sysctl::CtlValue::S8(i) => format!("{}", i),
        sysctl::CtlValue::S16(i) => format!("{}", i),
        sysctl::CtlValue::S32(i) => format!("{}", i),
        sysctl::CtlValue::S64(i) => format!("{}", i),
        sysctl::CtlValue::Struct(_) => "(opaque struct)".to_owned(),
        sysctl::CtlValue::Node(_) => "(node)".to_owned(),
        sysctl::CtlValue::String(s) => s.to_owned(),
        #[cfg(not(target_os = "macos"))]
        sysctl::CtlValue::Temperature(t) => format!("{} °C", t.celsius()),
    }
}

fn print_ctl(ctl: &sysctl::Ctl) {
    let name = ctl.name().expect("Could not get name of control");

    if let Ok(value) = ctl.value() {
        println!("{}: {}", name, format_value(value));
    }
}

fn main() {
    let args: Vec<_> = env::args().collect();

    let ctls = match args.len() {
        1 => sysctl::CtlIter::root().filter_map(Result::ok),
        2 => {
            let root = sysctl::Ctl::new(&args[1]).expect("Could not get given root node.");

            let value_type = root
                .value_type()
                .expect("could not get value type of given sysctl");
            if value_type != sysctl::CtlType::Node {
                print_ctl(&root);
                return;
            }

            root.into_iter().filter_map(Result::ok)
        }
        _ => panic!("more than 1 command-line argument given"),
    };

    for ctl in ctls {
        let flags = match ctl.flags() {
            Ok(f) => f,
            Err(_) => continue,
        };

        if !flags.contains(sysctl::CtlFlags::SKIP) {
            print_ctl(&ctl);
        }
    }
}