use std::{num::NonZeroU64, sync::Once};
use routee_compass_core::model::constraint::ConstraintModelError;
use serde::{Deserialize, Serialize};
use crate::model::constraint::multimodal::{Constraint, ConstraintConfig};
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct MultimodalConstraintModelQuery {
constraints: Option<Vec<ConstraintConfig>>,
#[serde(default = "unimodal_trip")]
pub max_trip_legs: NonZeroU64,
}
pub fn unimodal_trip() -> NonZeroU64 {
NonZeroU64::MIN
}
static EMPTY_CONSTRAINTS_WARNING: Once = Once::new();
impl MultimodalConstraintModelQuery {
pub fn build_constraints(&self) -> Result<Vec<Constraint>, ConstraintModelError> {
let constraints = self
.constraints
.as_deref()
.unwrap_or(&[])
.iter()
.map(Constraint::try_from)
.collect::<Result<Vec<_>, _>>()?;
if constraints.is_empty() {
EMPTY_CONSTRAINTS_WARNING.call_once(|| {
log::warn!("encountered a query with no multimodal constraints! in multimodal graphs this can lead to intractable search areas.");
});
}
Ok(constraints)
}
}