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")),
		}
	}
}