webrtc_constraints/algorithms/fitness_distance/
settings.rs1use std::collections::HashMap;
2
3use crate::{MediaTrackProperty, MediaTrackSettings, SanitizedMediaTrackConstraintSet};
4
5use super::{setting::SettingFitnessDistanceError, FitnessDistance};
6
7#[derive(Debug, Clone, Eq, PartialEq)]
9pub struct SettingsFitnessDistanceError {
10 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}