use super::{
super::{
supervision::{NoopObserverFactory, ObserverFactory},
NorthwardPublisher, RetryPolicy, Transform,
},
transport::{NoopSouthwardTransportMeter, SouthwardTransportMeter},
types::{AccessMode, CollectionType, DataPointType, DataType, ReportType, Status},
RuntimeChannel, RuntimeDevice, RuntimePoint,
};
use sea_orm::FromJsonQueryResult;
use serde::{Deserialize, Serialize};
use std::{collections::HashMap, sync::Arc, time::Duration};
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct ChannelModel {
pub id: i32,
pub driver_id: i32,
pub name: String,
pub collection_type: CollectionType,
pub period: Option<u32>,
pub report_type: ReportType,
pub status: Status,
pub connection_policy: ConnectionPolicy,
pub driver_config: serde_json::Value,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct DeviceModel {
pub id: i32,
pub channel_id: i32,
pub device_name: String,
pub device_type: String,
pub status: Status,
pub driver_config: Option<serde_json::Value>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct PointModel {
pub id: i32,
pub device_id: i32,
pub name: String,
pub key: String,
pub r#type: DataPointType,
pub data_type: DataType,
pub access_mode: AccessMode,
pub unit: Option<String>,
pub min_value: Option<f64>,
pub max_value: Option<f64>,
#[serde(default)]
pub transform: Transform,
pub driver_config: serde_json::Value,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct ActionModel {
pub id: i32,
pub device_id: i32,
pub name: String,
pub command: String,
pub inputs: Vec<Parameter>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct Parameter {
pub name: String,
pub key: String,
pub data_type: DataType,
pub required: bool,
pub default_value: Option<serde_json::Value>,
pub max_value: Option<f64>,
pub min_value: Option<f64>,
#[serde(default)]
pub transform: Transform,
pub driver_config: serde_json::Value,
}
#[derive(Clone)]
pub struct SouthwardInitContext {
pub devices: Vec<Arc<dyn RuntimeDevice>>,
pub points_by_device: HashMap<i32, Vec<Arc<dyn RuntimePoint>>>,
pub runtime_channel: Arc<dyn RuntimeChannel>,
pub publisher: Arc<dyn NorthwardPublisher>,
pub channel_id: i32,
pub transport_meter: Arc<dyn SouthwardTransportMeter>,
pub observer_factory: Arc<dyn ObserverFactory>,
}
impl SouthwardInitContext {
#[inline]
pub fn with_noop_observability(mut self) -> Self {
self.transport_meter = Arc::new(NoopSouthwardTransportMeter);
self.observer_factory = Arc::new(NoopObserverFactory);
self
}
}
#[derive(Debug, Clone, Default)]
pub struct DriverMetrics {
pub total_requests: u64,
pub successful_requests: u64,
pub failed_requests: u64,
pub average_response_time: Duration,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, FromJsonQueryResult)]
#[serde(rename_all = "camelCase")]
pub struct ConnectionPolicy {
#[serde(default = "ConnectionPolicy::default_connect_timeout_ms")]
pub connect_timeout_ms: u64,
#[serde(default = "ConnectionPolicy::default_read_timeout_ms")]
pub read_timeout_ms: u64,
#[serde(default = "ConnectionPolicy::default_write_timeout_ms")]
pub write_timeout_ms: u64,
#[serde(default)]
pub backoff: RetryPolicy,
}
impl ConnectionPolicy {
fn default_connect_timeout_ms() -> u64 {
10000
}
fn default_read_timeout_ms() -> u64 {
10000
}
fn default_write_timeout_ms() -> u64 {
10000
}
}
impl Default for ConnectionPolicy {
fn default() -> Self {
Self {
connect_timeout_ms: ConnectionPolicy::default_connect_timeout_ms(),
read_timeout_ms: ConnectionPolicy::default_read_timeout_ms(),
write_timeout_ms: ConnectionPolicy::default_write_timeout_ms(),
backoff: RetryPolicy::default(),
}
}
}
impl sea_orm::IntoActiveValue<ConnectionPolicy> for ConnectionPolicy {
fn into_active_value(self) -> sea_orm::ActiveValue<ConnectionPolicy> {
sea_orm::ActiveValue::Set(self)
}
}