use voxora_engine::EngineFamily;
use voxora_traits::ModelCapabilities;
use crate::id::ModelId;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct EngineCapabilities(pub ModelCapabilities);
#[derive(Debug, Clone)]
#[non_exhaustive]
pub struct EngineDescriptor {
pub family: EngineFamily,
pub label: String,
pub accepts: fn(&ModelId) -> bool,
pub default_capabilities: EngineCapabilities,
}
impl EngineDescriptor {
pub fn new(
family: EngineFamily,
label: impl Into<String>,
accepts: fn(&ModelId) -> bool,
default_capabilities: ModelCapabilities,
) -> Self {
Self {
family,
label: label.into(),
accepts,
default_capabilities: EngineCapabilities(default_capabilities),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::id::SourceKind;
fn whisper_descriptor() -> EngineDescriptor {
EngineDescriptor::new(
EngineFamily::Whisper,
"ggerganov/whisper.cpp ggml",
|id| {
matches!(id.source, SourceKind::HuggingFace)
&& id.repo.starts_with("ggerganov/whisper.cpp")
},
ModelCapabilities::UNKNOWN,
)
}
#[test]
fn whisper_descriptor_accepts_own_repo() {
let d = whisper_descriptor();
let id = ModelId::parse("ggerganov/whisper.cpp/ggml-tiny.bin").unwrap();
assert!((d.accepts)(&id));
}
#[test]
fn whisper_descriptor_rejects_other_repo() {
let d = whisper_descriptor();
let id = ModelId::parse("Qwen/Qwen3-ASR-0.6B").unwrap();
assert!(!(d.accepts)(&id));
}
}