use super::types::{SttProvider, TtsProvider};
#[derive(Debug, Clone, Copy, Default)]
pub(crate) struct SttReady {
pub groq_key: bool,
pub local: bool,
pub openai_compatible: bool,
pub voicebox: bool,
}
#[derive(Debug, Clone, Copy, Default)]
pub(crate) struct TtsReady {
pub openai_key: bool,
pub local: bool,
pub openai_compatible: bool,
pub voicebox: bool,
}
const STT_PRIORITY: [(SttProvider, &str); 4] = [
(SttProvider::Voicebox, "voicebox"),
(SttProvider::OpenAiCompatible, "openai_compatible"),
(SttProvider::Groq, "groq"),
(SttProvider::Local, "local"),
];
const TTS_PRIORITY: [(TtsProvider, &str); 4] = [
(TtsProvider::Voicebox, "voicebox"),
(TtsProvider::OpenAiCompatible, "openai_compatible"),
(TtsProvider::OpenAi, "openai"),
(TtsProvider::Local, "local"),
];
pub(crate) fn stt_chain(selected: SttProvider, ready: SttReady) -> Vec<String> {
if selected == SttProvider::Off {
return Vec::new();
}
let usable = |p: SttProvider| match p {
SttProvider::Off => false,
SttProvider::Groq => ready.groq_key,
SttProvider::Local => ready.local,
SttProvider::OpenAiCompatible => ready.openai_compatible,
SttProvider::Voicebox => ready.voicebox,
};
let label = |p: SttProvider| STT_PRIORITY.iter().find(|(k, _)| *k == p).map(|(_, l)| *l);
let mut chain: Vec<String> = label(selected).map(str::to_string).into_iter().collect();
chain.extend(
STT_PRIORITY
.iter()
.filter(|(p, _)| *p != selected && usable(*p))
.map(|(_, l)| l.to_string()),
);
chain
}
pub(crate) fn tts_chain(selected: TtsProvider, ready: TtsReady) -> Vec<String> {
if selected == TtsProvider::Off {
return Vec::new();
}
let usable = |p: TtsProvider| match p {
TtsProvider::Off => false,
TtsProvider::OpenAi => ready.openai_key,
TtsProvider::Local => ready.local,
TtsProvider::OpenAiCompatible => ready.openai_compatible,
TtsProvider::Voicebox => ready.voicebox,
};
let label = |p: TtsProvider| TTS_PRIORITY.iter().find(|(k, _)| *k == p).map(|(_, l)| *l);
let mut chain: Vec<String> = label(selected).map(str::to_string).into_iter().collect();
chain.extend(
TTS_PRIORITY
.iter()
.filter(|(p, _)| *p != selected && usable(*p))
.map(|(_, l)| l.to_string()),
);
chain
}
pub(crate) fn promote_head(chain: &[String], head: &str) -> Vec<String> {
std::iter::once(head.to_string())
.chain(chain.iter().filter(|c| c != &head).cloned())
.collect()
}