use serde::{Deserialize, Serialize};
use std::fmt;
fn default_sensor_count() -> u32 {
5
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum DataType {
Counter,
SensorReading {
#[serde(default = "default_sensor_count")]
sensor_count: u32,
},
#[default]
Generic,
}
impl DataType {
pub fn sensor_reading(sensor_count: u32) -> Self {
DataType::SensorReading { sensor_count }
}
pub fn sensor_count(&self) -> Option<u32> {
match self {
DataType::SensorReading { sensor_count } => Some(*sensor_count),
_ => None,
}
}
}
impl fmt::Display for DataType {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
DataType::Counter => write!(f, "counter"),
DataType::SensorReading { .. } => write!(f, "sensor_reading"),
DataType::Generic => write!(f, "generic"),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct MockSourceConfig {
#[serde(default)]
pub data_type: DataType,
#[serde(default = "default_interval_ms")]
pub interval_ms: u64,
}
fn default_interval_ms() -> u64 {
5000
}
impl Default for MockSourceConfig {
fn default() -> Self {
Self {
data_type: DataType::default(),
interval_ms: default_interval_ms(),
}
}
}
impl MockSourceConfig {
pub fn validate(&self) -> anyhow::Result<()> {
if self.interval_ms == 0 {
return Err(anyhow::anyhow!(
"Validation error: interval_ms cannot be 0. \
Please specify a positive interval in milliseconds (minimum 1)"
));
}
if let DataType::SensorReading { sensor_count } = &self.data_type {
if *sensor_count == 0 {
return Err(anyhow::anyhow!(
"Validation error: sensor_count cannot be 0. \
Please specify at least 1 sensor"
));
}
}
Ok(())
}
}