ng_gateway_sdk/southward/
model.rs1use super::{
2 super::{
3 supervision::{NoopObserverFactory, ObserverFactory},
4 NorthwardPublisher, RetryPolicy, Transform,
5 },
6 transport::{NoopSouthwardTransportMeter, SouthwardTransportMeter},
7 types::{AccessMode, CollectionType, DataPointType, DataType, ReportType, Status},
8 RuntimeChannel, RuntimeDevice, RuntimePoint,
9};
10use sea_orm::FromJsonQueryResult;
11use serde::{Deserialize, Serialize};
12use std::{collections::HashMap, sync::Arc, time::Duration};
13
14#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
15pub struct ChannelModel {
16 pub id: i32,
17 pub driver_id: i32,
19 pub name: String,
21 pub collection_type: CollectionType,
23 pub period: Option<u32>,
25 pub report_type: ReportType,
27 pub status: Status,
29 pub connection_policy: ConnectionPolicy,
31 pub driver_config: serde_json::Value,
33}
34
35#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
36pub struct DeviceModel {
37 pub id: i32,
38 pub channel_id: i32,
40 pub device_name: String,
42 pub device_type: String,
44 pub status: Status,
46 pub driver_config: Option<serde_json::Value>,
48}
49
50#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
51pub struct PointModel {
52 pub id: i32,
53 pub device_id: i32,
55 pub name: String,
57 pub key: String,
59 pub r#type: DataPointType,
61 pub data_type: DataType,
63 pub access_mode: AccessMode,
65 pub unit: Option<String>,
67 pub min_value: Option<f64>,
69 pub max_value: Option<f64>,
71 #[serde(default)]
79 pub transform: Transform,
80 pub driver_config: serde_json::Value,
82}
83
84#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
85pub struct ActionModel {
86 pub id: i32,
87 pub device_id: i32,
89 pub name: String,
91 pub command: String,
93 pub inputs: Vec<Parameter>,
95}
96
97#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
98pub struct Parameter {
99 pub name: String,
101 pub key: String,
103 pub data_type: DataType,
105 pub required: bool,
107 pub default_value: Option<serde_json::Value>,
109 pub max_value: Option<f64>,
111 pub min_value: Option<f64>,
113 #[serde(default)]
117 pub transform: Transform,
118 pub driver_config: serde_json::Value,
120}
121
122#[derive(Clone)]
127pub struct SouthwardInitContext {
128 pub devices: Vec<Arc<dyn RuntimeDevice>>,
130 pub points_by_device: HashMap<i32, Vec<Arc<dyn RuntimePoint>>>,
132 pub runtime_channel: Arc<dyn RuntimeChannel>,
134 pub publisher: Arc<dyn NorthwardPublisher>,
136 pub channel_id: i32,
138 pub transport_meter: Arc<dyn SouthwardTransportMeter>,
140 pub observer_factory: Arc<dyn ObserverFactory>,
142}
143
144impl SouthwardInitContext {
145 #[inline]
149 pub fn with_noop_observability(mut self) -> Self {
150 self.transport_meter = Arc::new(NoopSouthwardTransportMeter);
151 self.observer_factory = Arc::new(NoopObserverFactory);
152 self
153 }
154}
155
156#[derive(Debug, Clone, Default)]
158pub struct DriverMetrics {
159 pub total_requests: u64,
160 pub successful_requests: u64,
161 pub failed_requests: u64,
162 pub average_response_time: Duration,
163}
164
165#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, FromJsonQueryResult)]
166#[serde(rename_all = "camelCase")]
167pub struct ConnectionPolicy {
168 #[serde(default = "ConnectionPolicy::default_connect_timeout_ms")]
169 pub connect_timeout_ms: u64,
170 #[serde(default = "ConnectionPolicy::default_read_timeout_ms")]
171 pub read_timeout_ms: u64,
172 #[serde(default = "ConnectionPolicy::default_write_timeout_ms")]
173 pub write_timeout_ms: u64,
174 #[serde(default)]
175 pub backoff: RetryPolicy,
176}
177
178impl ConnectionPolicy {
179 fn default_connect_timeout_ms() -> u64 {
180 10000
181 }
182 fn default_read_timeout_ms() -> u64 {
183 10000
184 }
185 fn default_write_timeout_ms() -> u64 {
186 10000
187 }
188}
189
190impl Default for ConnectionPolicy {
191 fn default() -> Self {
192 Self {
193 connect_timeout_ms: ConnectionPolicy::default_connect_timeout_ms(),
194 read_timeout_ms: ConnectionPolicy::default_read_timeout_ms(),
195 write_timeout_ms: ConnectionPolicy::default_write_timeout_ms(),
196 backoff: RetryPolicy::default(),
197 }
198 }
199}
200
201impl sea_orm::IntoActiveValue<ConnectionPolicy> for ConnectionPolicy {
202 fn into_active_value(self) -> sea_orm::ActiveValue<ConnectionPolicy> {
203 sea_orm::ActiveValue::Set(self)
204 }
205}