mpd 0.0.3

A client library for MPD (music player daemon), like libmpdclient but in Rust

use std::old_io::{standard_error, IoErrorKind, Stream};
use std::iter::FromIterator;
use std::error::FromError;

use error::MpdResult;
use client::{MpdPair, MpdClient};
use utils::FieldCutIter;
use rustc_serialize::{Encoder, Encodable};

#[derive(RustcEncodable, Debug)]
pub struct MpdOutput {
    pub id: usize,
    pub name: String,
    pub enabled: bool
}

impl MpdOutput {
    pub fn enable<S: Stream>(&mut self, cli: &mut MpdClient<S>) -> MpdResult<()> {
        cli.exec_arg("enableoutput", self.id).map(|_| self.enabled = true)
    }
    pub fn disable<S: Stream>(&mut self, cli: &mut MpdClient<S>) -> MpdResult<()> {
        cli.exec_arg("disableoutput", self.id).map(|_| self.enabled = false)
    }
    pub fn toggle<S: Stream>(&mut self, cli: &mut MpdClient<S>) -> MpdResult<()> {
        cli.exec_arg("toggleoutput", self.id).map(|_| self.enabled = !self.enabled)
    }
}

impl FromIterator<MpdResult<MpdPair>> for MpdResult<MpdOutput> {
    fn from_iter<T: Iterator<Item=MpdResult<MpdPair>>>(iterator: T) -> MpdResult<MpdOutput> {
        let mut output = MpdOutput {
            id: 0,
            name: "".to_string(),
            enabled: false,
        };

        let mut iter = iterator;

        for field in iter {
            let MpdPair(key, value) = try!(field);
            match &*key {
                "outputid" => output.id = value.parse().unwrap_or(0),
                "outputname" => output.name = value,
                "outputenabled" => output.enabled = value == "1",
                _ => return Err(FromError::from_error(standard_error(IoErrorKind::InvalidInput)))
            }
        }

        Ok(output)
    }
}

mpd_collectable!(MpdOutput, "outputid");