cal_core/device/
time_range_router.rs1use crate::device::device::Connector;
2use crate::{ConnectState, FlowState};
3use bson::DateTime;
4use chrono::Local;
5use serde::{Deserialize, Serialize};
6use std::fmt::{Debug, Formatter};
7
8#[derive(Serialize, Deserialize, Clone)]
9#[serde(rename_all = "camelCase")]
10pub struct TimeRangeRouter {
11 pub start: DateTime,
12 pub end: DateTime,
13 #[serde(default = "crate::device::shared::build_default_timezone")]
14 pub timezone: String,
15 #[serde(default = "crate::device::shared::build_connect_to")]
16 pub on_match: String,
17 #[serde(default = "crate::device::shared::build_connect_to")]
18 pub connect_to: String,
19}
20
21impl Connector for TimeRangeRouter {
22 fn get_connect_to(&mut self, _state: &mut FlowState) -> ConnectState {
23 let now = Local::now().naive_utc().time();
24 let start = self.start.to_chrono().naive_utc().time();
25 let end = self.end.to_chrono().naive_utc().time();
26 let within = now < end && now > start;
27 if within {
28 ConnectState::matched(self.on_match.as_str(), Some(now.to_string()), None)
29 } else {
30 ConnectState::default(self.on_match.as_str(), Some(now.to_string()))
31 }
32 }
33}
34
35impl Debug for TimeRangeRouter {
36 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
37 f.debug_struct("TimeRangeRouter")
38 .field("start", &self.start)
39 .field("end", &self.end)
40 .field("timezone", &self.timezone)
41 .field("on_match", &self.on_match)
42 .field("connect_to", &self.connect_to)
43 .finish()
44 }
45}