use super::{Choice, Model, Pick, Selector};
pub(crate) fn lane(on: bool) -> &'static str {
if on { "on" } else { crate::verbs::tuning::OFF }
}
impl Model {
pub fn choices(&self) -> Vec<Choice> {
let Some(open) = &self.dropup else {
return Vec::new();
};
let worker = self.worker();
match open.selector {
Selector::Workspace => self.walls(),
Selector::Provider => self
.providers
.iter()
.flatten()
.map(|row| Choice {
text: row.name.clone(),
current: worker.is_some_and(|w| w.provider == row.name),
pick: Pick::Provider(row.name.clone()),
})
.collect(),
Selector::Model => {
let provider = open.provider.clone().unwrap_or_default();
let mut ids = self.offered_by(&provider);
if let Some(w) = worker.filter(|w| w.provider == provider)
&& !ids.contains(&w.model)
{
ids.insert(0, w.model.clone());
}
ids.into_iter()
.map(|id| Choice {
current: worker.is_some_and(|w| w.provider == provider && w.model == id),
text: id.clone(),
pick: Pick::Model(id),
})
.collect()
}
Selector::Effort => crate::verbs::tuning::levels()
.into_iter()
.map(|level| Choice {
text: crate::verbs::tuning::word(level.as_ref()),
current: worker.is_some_and(|w| w.effort == level),
pick: Pick::Effort(level),
})
.collect(),
Selector::Priority => [true, false]
.into_iter()
.map(|on| Choice {
text: lane(on).to_owned(),
current: worker.is_some_and(|w| w.priority == on),
pick: Pick::Priority(on),
})
.collect(),
}
}
fn walls(&self) -> Vec<Choice> {
let many = self.roster.len() > 1;
let found = self
.roster
.iter()
.find(|chunk| {
chunk.channel.name == crate::seat::OWN
&& !matches!(chunk.held, crate::ui::Held::Unheld(_))
})
.map(|chunk| Choice {
text: crate::ui::roster::engine::FOUND.to_owned(),
current: false,
pick: Pick::Found(chunk.channel.name.clone()),
});
self.roster
.iter()
.flat_map(|chunk| {
chunk.walls.iter().filter_map(move |row| {
let address = chunk.channel.address(row)?;
let aim = super::Aim {
channel: chunk.channel.name.clone(),
address,
};
Some(Choice {
text: if many {
format!("{} · {}", row.workspace, chunk.channel.name)
} else {
row.workspace.clone()
},
current: self.aim.as_ref() == Some(&aim),
pick: Pick::Wall(aim),
})
})
})
.chain(found)
.collect()
}
}