cal-core 0.2.158

Callable core lib
Documentation
use crate::device::device::Connector;
use crate::{ConnectState, FlowState};
use bson::DateTime;
use chrono::Local;
use serde::{Deserialize, Serialize};
use std::fmt::{Debug, Formatter};

#[derive(Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct TimeRangeRouter {
    pub start: DateTime,
    pub end: DateTime,
    #[serde(default = "crate::device::shared::build_default_timezone")]
    pub timezone: String,
    #[serde(default = "crate::device::shared::build_connect_to")]
    pub on_match: String,
    #[serde(default = "crate::device::shared::build_connect_to")]
    pub connect_to: String,
}

impl Connector for TimeRangeRouter {
    fn get_connect_to(&mut self, _state: &mut FlowState) -> ConnectState {
        let now = Local::now().naive_utc().time();
        let start = self.start.to_chrono().naive_utc().time();
        let end = self.end.to_chrono().naive_utc().time();
        let within = now < end && now > start;
        if within {
            ConnectState::matched(self.on_match.as_str(), Some(now.to_string()), None)
        } else {
            ConnectState::default(self.on_match.as_str(), Some(now.to_string()))
        }
    }
}

impl Debug for TimeRangeRouter {
    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
        f.debug_struct("TimeRangeRouter")
            .field("start", &self.start)
            .field("end", &self.end)
            .field("timezone", &self.timezone)
            .field("on_match", &self.on_match)
            .field("connect_to", &self.connect_to)
            .finish()
    }
}