webrtc_constraints/algorithms/fitness_distance/
settings.rs

1use std::collections::HashMap;
2
3use crate::{MediaTrackProperty, MediaTrackSettings, SanitizedMediaTrackConstraintSet};
4
5use super::{setting::SettingFitnessDistanceError, FitnessDistance};
6
7/// A list of media track properties and their corresponding fitness distance errors.
8#[derive(Debug, Clone, Eq, PartialEq)]
9pub struct SettingsFitnessDistanceError {
10    /// Setting errors per media track property.
11    pub setting_errors: HashMap<MediaTrackProperty, SettingFitnessDistanceError>,
12}
13
14impl<'a> FitnessDistance<&'a MediaTrackSettings> for SanitizedMediaTrackConstraintSet {
15    type Error = SettingsFitnessDistanceError;
16
17    fn fitness_distance(&self, settings: &'a MediaTrackSettings) -> Result<f64, Self::Error> {
18        let results: HashMap<MediaTrackProperty, _> = self
19            .iter()
20            .map(|(property, constraint)| {
21                let setting = settings.get(property);
22                let result = constraint.fitness_distance(setting);
23                (property.clone(), result)
24            })
25            .collect();
26
27        let mut total_fitness_distance = 0.0;
28
29        let mut setting_errors: HashMap<MediaTrackProperty, SettingFitnessDistanceError> =
30            Default::default();
31
32        for (property, result) in results.into_iter() {
33            match result {
34                Ok(fitness_distance) => total_fitness_distance += fitness_distance,
35                Err(error) => {
36                    setting_errors.insert(property, error);
37                }
38            }
39        }
40
41        if setting_errors.is_empty() {
42            Ok(total_fitness_distance)
43        } else {
44            Err(SettingsFitnessDistanceError { setting_errors })
45        }
46    }
47}