use super::{DELETE, LEAD, PLAN, REFRESH, rows};
use crate::ui::Model;
pub fn fire(model: &mut Model, word: &str, rest: &str) -> bool {
if !rows(model).iter().any(|row| row.word == word) || wanting(model, word, rest).is_some() {
return false;
}
if let Some(fired) = conversation(model, word, rest) {
return fired;
}
match word {
PLAN => model.plan = !model.plan,
REFRESH => model.refresh_roster(),
w if w == crate::verbs::PIN.word => model.post_pin(true),
w if w == crate::verbs::UNPIN.word => model.post_pin(false),
w if w == crate::ui::enroll::WORD => model.begin_enrollment(),
w if w == crate::ui::tuning::WORD || w == crate::ui::tuning::MODEL => {
model.begin_tuning();
}
w if w == crate::ui::login::WORD => model.begin_login(),
w if w == crate::ui::clients::WORD => model.begin_clients(),
w if w == crate::ui::config::WORD => model.begin_configuring(),
w if w == crate::ui::fleet::WORD => model.begin_fleet(),
w if w == crate::ui::unmake::WORD => model.begin_unmaking(),
w if w == crate::ui::queue::WORD => model.begin_queue(),
w if w == crate::ui::commands::WORD => model.begin_commands(),
w if w == crate::ui::doctor::WORD => model.begin_doctor(),
w if w == crate::ui::trail::WORD => model.begin_trail(),
w if w == crate::ui::board::WORD => model.begin_board(),
w if w == crate::ui::prices::WORD => model.begin_prices(),
w if w == crate::ui::switcher::WORD => model.switching = true,
_ => {
model.begin_finding();
if !rest.is_empty() {
rest.clone_into(&mut model.needle);
model.post_search();
}
}
}
true
}
fn conversation(model: &mut Model, word: &str, rest: &str) -> Option<bool> {
use crate::verbs;
let (aim, agent) = (model.aim.clone()?, model.conversation.clone()?);
let (address, agent) = (aim.address, agent);
let gesture = match word {
w if w == crate::ui::records::WORD => {
model.begin_records();
return Some(true);
}
w if w == verbs::INTERRUPT.word => verbs::interrupt(address, agent, rest.to_owned()),
w if w == verbs::STOP.word => {
verbs::stop(address, agent, rest == verbs::conversation::CHILDREN)
}
w if w == verbs::NUDGE.word => verbs::nudge(address, agent),
w if w == verbs::REVOKE.word => verbs::revoke(address, agent),
w if w == verbs::RESTORE.word => verbs::restore(address, agent),
w if w == verbs::RETARGET.word => verbs::retarget(address, agent),
w if w == verbs::FLAG.word => verbs::flag(address, agent, rest.to_owned()),
DELETE => verbs::delete_agent(address, agent, rest.trim().to_owned()),
_ => return None,
};
model.outbox.push(crate::ui::Posted::act(gesture));
Some(true)
}
pub fn wanting(model: &Model, word: &str, rest: &str) -> Option<String> {
use crate::verbs;
match word {
w if w == verbs::FLAG.word && rest.is_empty() => Some(format!(
"{LEAD}{w} needs its reason after it — {LEAD}{w} <reason>"
)),
w if w == verbs::INTERRUPT.word && rest.is_empty() => Some(format!(
"{LEAD}{w} needs the words to say instead — {LEAD}{w} <words>"
)),
DELETE => {
let id = model.conversation.as_deref()?;
let name = model
.rows()
.into_iter()
.find(|row| row.root_id == id)
.map_or_else(|| id.to_owned(), |row| row.display);
(rest.trim() != name).then(|| {
format!(
"{LEAD}{DELETE} is armed by the conversation's own name — {LEAD}{DELETE} {name}"
)
})
}
_ => None,
}
}