use std::collections::HashSet;
use crate::{
algorithms::fitness_distance::SettingFitnessDistanceError, errors::OverconstrainedError,
MediaTrackSettings, SanitizedMediaTrackConstraints,
};
mod apply_advanced;
mod apply_mandatory;
mod select_optimal;
mod tie_breaking;
pub use self::tie_breaking::*;
use self::{apply_advanced::*, apply_mandatory::*, select_optimal::*};
#[derive(Copy, Clone, Eq, PartialEq, Debug)]
pub enum DeviceInformationExposureMode {
Exposed,
Protected,
}
#[derive(Clone, Eq, PartialEq, Debug)]
pub enum SelectSettingsError {
Overconstrained(OverconstrainedError),
}
impl From<OverconstrainedError> for SelectSettingsError {
fn from(error: OverconstrainedError) -> Self {
Self::Overconstrained(error)
}
}
pub fn select_settings_candidates<'a, I>(
possible_settings: I,
constraints: &SanitizedMediaTrackConstraints,
exposure_mode: DeviceInformationExposureMode,
) -> Result<Vec<&'a MediaTrackSettings>, SelectSettingsError>
where
I: IntoIterator<Item = &'a MediaTrackSettings>,
{
let possible_settings = possible_settings.into_iter();
debug_assert!(constraints
.mandatory
.iter()
.all(|(_, constraint)| !constraint.is_empty()));
let candidates_and_fitness_distances =
apply_mandatory_constraints(possible_settings, &constraints.mandatory, exposure_mode)?;
let candidates =
apply_advanced_constraints(candidates_and_fitness_distances, &constraints.advanced);
Ok(select_optimal_candidates(candidates))
}
#[derive(Default)]
pub(crate) struct ConstraintFailureInfo {
pub(crate) failures: usize,
pub(crate) errors: HashSet<SettingFitnessDistanceError>,
}
#[cfg(test)]
mod tests;