bambam 0.3.1

The Behavior and Advanced Mobility Big Access Model
Documentation
use std::{path::Path, sync::Arc};

use routee_compass_core::{
    model::{
        constraint::{ConstraintModel, ConstraintModelError, ConstraintModelService},
        state::StateModel,
    },
    util::fs::{read_decoders, read_utils},
};

use crate::model::constraint::multimodal::{
    model::MultimodalConstraintModel, Constraint, MultimodalConstraintConfig,
    MultimodalConstraintEngine, MultimodalConstraintModelQuery,
};
use bambam_core::model::state::{MultimodalMapping, MultimodalStateMapping};

pub struct MultimodalConstraintService {
    pub engine: Arc<MultimodalConstraintEngine>,
}

impl MultimodalConstraintService {
    pub fn new(
        config: MultimodalConstraintConfig,
    ) -> Result<MultimodalConstraintService, ConstraintModelError> {
        let mode_mapping = MultimodalMapping::new(&config.available_modes).map_err(|e| {
            ConstraintModelError::BuildError(format!("while building mode mapping: {e}"))
        })?;
        let mode_to_state = Arc::new(mode_mapping);
        let engine = MultimodalConstraintEngine {
            mode: config.this_mode,
            mode_to_state,
        };
        let service = MultimodalConstraintService {
            engine: Arc::new(engine),
        };
        Ok(service)
    }
}

impl ConstraintModelService for MultimodalConstraintService {
    fn build(
        &self,
        query: &serde_json::Value,
        state_model: Arc<StateModel>,
    ) -> Result<Arc<dyn ConstraintModel>, ConstraintModelError> {
        let model_config: MultimodalConstraintModelQuery = serde_json::from_value(query.clone())
            .map_err(|e| {
                ConstraintModelError::BuildError(format!(
                    "while reading query for multimodal constraint model, {e}"
                ))
            })?;
        let constraints = model_config.build_constraints()?;

        let model = MultimodalConstraintModel::new(
            self.engine.clone(),
            constraints,
            model_config.max_trip_legs,
        );
        Ok(Arc::new(model))
    }
}