use super::super::terminal::Inside;
use super::Session;
impl Session {
pub(crate) fn arguments(&self, inside: &Inside, verb: wire::Slash) -> Vec<String> {
let book = || match (inside.answering)(wire::Query::EndpointView) {
(_, Ok(wire::Answer::Endpoints(book))) => Some(book),
(_, Ok(_) | Err(_)) => None,
};
match verb {
wire::Slash::Model => {
let Some(book) = book() else {
return Vec::new();
};
let mut ids: Vec<String> = book
.endpoints
.iter()
.flat_map(|endpoint| endpoint.models.iter().map(|model| model.id.clone()))
.collect();
ids.sort();
ids.dedup();
ids
}
wire::Slash::Effort => book()
.as_ref()
.and_then(|book| self.current_offer(book))
.map_or_else(Vec::new, |model| {
model
.thinking
.levels
.iter()
.map(|level| level.as_str().to_owned())
.collect()
}),
wire::Slash::Help
| wire::Slash::Room
| wire::Slash::New
| wire::Slash::Stop
| wire::Slash::Halt
| wire::Slash::Release
| wire::Slash::Approve
| wire::Slash::Deny
| wire::Slash::Web
| wire::Slash::Quit
| wire::Slash::Serving
| wire::Slash::Remote
| wire::Slash::Acp
| wire::Slash::Wire => Vec::new(),
}
}
pub(crate) fn offer(&self, inside: &Inside) -> String {
let main = || match (inside.answering)(wire::Query::EndpointView) {
(_, Ok(wire::Answer::Endpoints(book))) => book
.chosen
.into_iter()
.find(|chosen| chosen.tag == kernel::ModelTag::Main)
.map(|chosen| chosen.model),
(_, Ok(_) | Err(_)) => None,
};
let effort = self.effort.map(|level| level.as_str().to_owned());
let said: Vec<String> = self
.model
.clone()
.or_else(main)
.into_iter()
.chain(effort)
.collect();
said.join(" · ")
}
fn current_offer<'a>(
&self,
book: &'a wire::EndpointsAnswer,
) -> Option<&'a wire::ModelFactsSummary> {
let main = book
.chosen
.iter()
.find(|chosen| chosen.tag == kernel::ModelTag::Main);
let wanted = self
.model
.as_deref()
.or(main.map(|chosen| chosen.model.as_str()))?;
let served = |endpoint: &'a wire::EndpointSummary| {
endpoint.models.iter().find(|model| model.id == wanted)
};
book.endpoints
.iter()
.filter(|endpoint| main.is_some_and(|chosen| chosen.endpoint == endpoint.name))
.find_map(served)
.or_else(|| book.endpoints.iter().find_map(served))
}
}