pub use gpio::GpioDriver; pub use null::NullDriver; pub use piface::PiFaceDriver; use serde::{Deserialize, Deserializer}; use crate::errors::EmgauwaControllerError; mod gpio; mod null; mod piface; pub trait RelayDriver { fn get_high(&self, value: bool) -> bool { value ^ self.get_inverted() } fn set(&mut self, value: bool) -> Result<(), EmgauwaControllerError>; fn get_inverted(&self) -> bool; } #[derive(Debug, Clone, Copy)] pub enum Driver { Null, Gpio, PiFace, } impl<'de> Deserialize<'de> for Driver { fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: Deserializer<'de>, { match String::deserialize(deserializer)?.as_str() { "null" => Ok(Driver::Null), "gpio" => Ok(Driver::Gpio), "piface" => Ok(Driver::PiFace), _ => Err(serde::de::Error::custom("invalid driver")), } } }