cal_core/device/
time_range_router.rs

1use 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}