routee-compass-core 0.7.0

The core routing algorithms and data structures of the RouteE-Compass energy-aware routing engine
Documentation
use crate::model::{
    access::{
        access_model::AccessModel, access_model_error::AccessModelError,
        access_model_service::AccessModelService,
    },
    property::{edge::Edge, vertex::Vertex},
    state::{state_feature::StateFeature, state_model::StateModel},
    traversal::state::state_variable::StateVar,
};
use itertools::Itertools;
use std::sync::Arc;

pub struct CombinedAccessModelService {
    pub services: Vec<Arc<dyn AccessModelService>>,
}

pub struct CombinedAccessModel {
    pub models: Vec<Arc<dyn AccessModel>>,
}

impl AccessModelService for CombinedAccessModelService {
    fn build(&self, query: &serde_json::Value) -> Result<Arc<dyn AccessModel>, AccessModelError> {
        let models = self
            .services
            .iter()
            .map(|m| m.build(query))
            .collect::<Result<_, _>>()?;
        Ok(Arc::new(CombinedAccessModel { models }))
    }
}

impl AccessModel for CombinedAccessModel {
    fn state_features(&self) -> Vec<(String, StateFeature)> {
        self.models
            .iter()
            .flat_map(|m| m.state_features())
            .collect_vec()
    }

    fn access_edge(
        &self,
        traversal: (&Vertex, &Edge, &Vertex, &Edge, &Vertex),
        state: &mut Vec<StateVar>,
        state_model: &StateModel,
    ) -> Result<(), AccessModelError> {
        for model in self.models.iter() {
            model.access_edge(traversal, state, state_model)?;
        }
        Ok(())
    }
}