use std::sync::Arc;
use quick_error::quick_error;
use redis::Commands;
use redis::RedisError;
use crate::api::sensors;
use crate::types::RedisPool;
pub(crate) struct SensorSpec {
pub(crate) template: Box<dyn sensors::SensorTemplate>,
pub(crate) data_key: String,
}
quick_error! {
#[derive(Debug)]
pub enum SensorError {
UnknownSensor(err: String) {
display("Unknown sensor: {}", err)
}
Redis(err: RedisError) {
from()
source(err)
}
R2d2(err: r2d2::Error) {
from()
source(err)
}
}
}
pub(crate) type SafeSensorSpecs = Arc<Vec<SensorSpec>>;
impl SensorSpec {
pub(crate) fn get_sensor_value(&self, redis_pool: &RedisPool) -> Result<String, SensorError> {
let mut conn = redis_pool.get()?;
let value: String = conn.get(&*self.data_key)?;
Ok(value)
}
pub(crate) fn set_sensor_value(&self, redis_pool: &RedisPool, value: &str) -> Result<(), SensorError> {
let mut conn = redis_pool.get()?;
let _: String = conn.set(&*self.data_key, value)?;
Ok(())
}
}