use std::error;
use std::fmt;
use std::result;
use futures;
use i2cdev;
use tokio_timer;
pub type Result<A, D> = result::Result<A, Error<D>>;
pub enum Error<D>
where
D: i2cdev::core::I2CDevice,
{
I2C(D::Error),
Timer(tokio_timer::Error),
Canceled(futures::sync::oneshot::Canceled),
}
impl<D> fmt::Debug for Error<D>
where
D: i2cdev::core::I2CDevice,
{
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
Error::I2C(ref e) => f.debug_tuple("I2C").field(e).finish(),
Error::Timer(ref e) => f.debug_tuple("Timer").field(e).finish(),
Error::Canceled(ref e) => f.debug_tuple("Canceled").field(e).finish(),
}
}
}
impl<D> fmt::Display for Error<D>
where
D: i2cdev::core::I2CDevice,
{
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
Error::I2C(ref e) => write!(f, "i2c error: {}", e),
Error::Timer(ref e) => write!(f, "timer error: {}", e),
Error::Canceled(ref e) => write!(f, "canceled: {}", e),
}
}
}
impl<D> error::Error for Error<D> where D: i2cdev::core::I2CDevice {}