cal_core/device/
dnis_router.rs

1use std::fmt::{Debug, Formatter};
2use serde::{Serialize, Deserialize};
3use crate::device::device::Connector;
4use crate::{ConnectState, FlowState};
5use crate::router_option::RouterOption;
6
7#[derive(Serialize, Deserialize, Clone)]
8#[serde(rename_all = "camelCase")]
9pub struct DNISRouter {
10    #[serde(default)]
11    pub options: Vec<RouterOption>,
12    #[serde(default = "crate::device::shared::build_connect_to")]
13    pub connect_to: String,
14}
15
16impl DNISRouter {
17    fn get_opts(&mut self) -> Vec<RouterOption> {
18        let opts = &mut self.options.clone();
19        opts.sort_by_key(|o| o.option.chars().count());
20        opts.reverse();
21        opts.clone()
22    }
23}
24
25impl Connector for DNISRouter {
26    fn get_connect_to(&mut self, state: &mut FlowState) -> ConnectState {
27        let str = state.get_to();
28        self.get_opts()
29            .iter()
30            .find(|o| o.option.starts_with(str.as_str()))
31            .map(|o| {
32                ConnectState::matched(
33                    o.connect_to.as_str(),
34                    Some(str.to_string()),
35                    Some(o.option.clone()),
36                )
37            })
38            .unwrap_or_else(|| {
39                ConnectState::default(self.connect_to.as_str(), Some(str.to_string()))
40            })
41    }
42}
43
44impl Debug for DNISRouter {
45    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
46        f.debug_struct("DNISRouter")
47            .field("options", &self.options)
48            .field("connect_to", &self.connect_to)
49            .finish()
50    }
51}