use super::{ModelDescriptor, REGISTRY, get_model_profile, profile_data};
use crate::model_profile_data::{ModelProfile, ModelVendor, ServiceKind};
#[derive(Debug, Clone, PartialEq)]
pub struct ModelProfileEntry {
pub model_id: String,
pub aliases: Vec<String>,
pub key: String,
pub vendor: ModelVendor,
pub service: ServiceKind,
pub profile: ModelProfile,
}
fn profile_entry(descriptor: &ModelDescriptor, profile: ModelProfile) -> ModelProfileEntry {
ModelProfileEntry {
model_id: descriptor.ids[0].into(),
aliases: descriptor.ids[1..].iter().map(|id| (*id).into()).collect(),
key: format!("{}/{}", descriptor.vendor.slug(), descriptor.ids[0]),
vendor: descriptor.vendor,
service: descriptor.service,
profile,
}
}
pub fn all_profile_entries() -> Vec<ModelProfileEntry> {
REGISTRY
.iter()
.filter_map(|descriptor| {
profile_data(descriptor.ids[0]).map(|profile| profile_entry(descriptor, profile))
})
.collect()
}
pub fn profile_entries_for_provider(provider_type: &str) -> Vec<ModelProfileEntry> {
REGISTRY
.iter()
.filter(|descriptor| descriptor.surfaces.contains(&provider_type))
.filter_map(|descriptor| {
get_model_profile(provider_type, descriptor.ids[0])
.map(|profile| profile_entry(descriptor, profile))
})
.collect()
}
pub fn all_profiles() -> Vec<ModelProfile> {
REGISTRY
.iter()
.filter_map(|descriptor| profile_data(descriptor.ids[0]))
.collect()
}
pub fn profiles_for_provider(provider_type: &str) -> Vec<ModelProfile> {
REGISTRY
.iter()
.filter(|descriptor| descriptor.surfaces.contains(&provider_type))
.filter_map(|descriptor| get_model_profile(provider_type, descriptor.ids[0]))
.collect()
}
pub fn selected_profiles() -> Vec<ModelProfile> {
all_profiles()
}
pub fn selected_profiles_for_provider(provider_type: &str) -> Vec<ModelProfile> {
profiles_for_provider(provider_type)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn registry_enumeration_covers_every_descriptor_and_surface() {
assert_eq!(all_profile_entries().len(), REGISTRY.len());
for descriptor in REGISTRY {
assert!(
profile_data(descriptor.ids[0]).is_some(),
"missing {}",
descriptor.ids[0]
);
for provider in descriptor.surfaces {
let entries = profile_entries_for_provider(provider);
assert_eq!(
entries.len(),
REGISTRY
.iter()
.filter(|entry| entry.surfaces.contains(provider))
.count()
);
assert!(
entries
.iter()
.any(|entry| entry.model_id == descriptor.ids[0]),
"missing {provider}/{}",
descriptor.ids[0]
);
}
}
}
}