cal-core 0.2.158

Callable core lib
Documentation
// Filename cal-core/src/device/ani_router.rs

use std::fmt::{Debug, Formatter};
use serde::{Serialize, Deserialize};
use crate::device::device::{Connector};
use crate::{ConnectState, FlowState};
use crate::device::router_option::RouterOption;

#[derive(Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct ANIRouter {
    #[serde(default)]
    pub options: Vec<RouterOption>,
    #[serde(default = "crate::device::shared::build_connect_to")]
    pub connect_to: String,
}

impl ANIRouter {
    fn get_opts(&mut self) -> Vec<RouterOption> {
        let opts = &mut self.options.clone();
        opts.sort_by_key(|o| o.option.chars().count());
        opts.reverse();
        opts.clone()
    }
}

impl Connector for ANIRouter {
    fn get_connect_to(&mut self, state: &mut FlowState) -> ConnectState {
        let str = state.get_paid_or_from();
        self.get_opts()
            .iter()
            .find(|o| o.option.starts_with(str.as_str()))
            .map(|o| {
                ConnectState::matched(
                    o.connect_to.as_str(),
                    Some(str.to_string()),
                    Some(o.option.clone()),
                )
            })
            .unwrap_or_else(|| {
                ConnectState::default(self.connect_to.as_str(), Some(str.to_string()))
            })
    }
}

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