openrazer 0.1.0

Asynchronous bindings to the OpenRazer daemon.
Documentation
use super::CapabilityBase;
use crate::Error;
use dbus_message_parser::Value;
use std::convert::TryInto;

pub struct MatrixDimensions(pub(crate) CapabilityBase);

#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash)]
pub struct Dimensions {
    pub rows: usize,
    pub columns: usize,
}

impl MatrixDimensions {
    pub(crate) const INTERFACE: &'static str = "razer.device.misc";
    pub(crate) const GET_METHOD: &'static str = "getMatrixDimensions";

    pub async fn get(&self) -> Result<Dimensions, Error> {
        self.0
            .call_get_method(Self::INTERFACE, Self::GET_METHOD)
            .await
            .and_then(|response| match response {
                Value::Array(dimensions, _) => match dimensions.as_slice() {
                    [Value::Int32(rows), Value::Int32(columns)] => {
                        let rows = (*rows).try_into().or(Err(Error::InvalidResponse))?;
                        let columns = (*columns).try_into().or(Err(Error::InvalidResponse))?;
                        Ok(Dimensions { rows, columns })
                    }
                    _ => Err(Error::InvalidResponse),
                },
                _ => Err(Error::InvalidResponse),
            })
    }
}