yamaha_avr 0.2.0

A Library and CLI Tool for interaction with Yamaha AVRs
Documentation
#[macro_use]
extern crate clap;
extern crate yamaha_avr;

use clap::App;

fn main() {
    let matches = clap_app!(@app(App::new("Yamaha AVR Remote"))
        (version: "0.2.0")
        (author: "Max Jöhnk <maxjoehnk@gmail.com>")
        (@arg ip: --ip +takes_value "Set the AVR Ip")
        (@subcommand power =>
            (about: "Get/Set Power")
            (@arg value: "Get/Set the Power state")
        )
        (@subcommand mute =>
            (about: "Mute/Unmute")
            (@arg value: "Set the Mute State")
        )
        (@subcommand inputs =>
            (about: "Get available Inputs")
        )
        (@subcommand select =>
            (about: "Select Input")
            (@arg input: +required "The Input to select")
        )
        (@subcommand volume =>
            (@setting AllowNegativeNumbers)
            (about: "Get/set the volume")
            (@arg value: "The Volume to set to")
        )
    ).get_matches();
    let ip: String = matches.value_of("ip").unwrap_or("192.168.2.102").to_owned();
    let mut avr = yamaha_avr::connect(ip);
    if let Some(matches) = matches.subcommand_matches("power") {
        match matches.value_of("value") {
            Some(value) => {
                let parsed_value = parse_bool_state(value);
                if parsed_value.is_some() {
                    avr.set_power(parsed_value.unwrap()).unwrap();
                }else {
                    println!("Invalid value {}", value);
                }
            },
            None => {
                let power = avr.get_power().unwrap();
                println!("Power: {}", transform_bool_state(power));
            }
        }
    }
    if let Some(matches) = matches.subcommand_matches("mute") {
        match matches.value_of("value") {
            Some(value) => {
                let parsed_value = parse_bool_state(value);
                if parsed_value.is_some() {
                    avr.set_mute(parsed_value.unwrap()).unwrap();
                }else {
                    println!("Invalid value {}", value);
                }
            },
            None => {
                let muted = avr.get_mute().unwrap();
                println!("Mute: {}", transform_bool_state(muted));
            }
        }
    }
    if matches.subcommand_matches("inputs").is_some() {
        let inputs = avr.get_inputs().unwrap();
        for input in inputs {
            println!("{}", input.name);
        }
    }
    if let Some(matches) = matches.subcommand_matches("select") {
        let input = matches.value_of("input").unwrap().to_owned();
        avr.select_input(input, None).unwrap();
    }
    if let Some(matches) = matches.subcommand_matches("volume") {
        match matches.value_of("value") {
            Some(value) => {
                let parsed_value: Result<i32, std::num::ParseIntError> = value.parse();
                if parsed_value.is_ok() {
                    avr.set_volume(parsed_value.unwrap()).unwrap();
                }else {
                    println!("Invalid value {}", value);
                }
            },
            None => {
                let volume = avr.get_volume().unwrap();
                println!("Volume: {:?}", volume);
            }
        }
    }
}

fn parse_bool_state(input: &str) -> Option<bool> {
    if input == "on" {
        return Some(true);
    }else if input == "off" {
        return Some(false);
    }
    None
}

fn transform_bool_state(input: bool) -> &'static str {
    if input { "On" } else { "Off" }
}