use super::{Channel, Chunk, Held, Model, Notice};
use crate::reply::{Read, Reply};
impl Model {
pub fn absorb(&mut self, channel: &Channel, read: Read) {
match read {
Read::Answer(reply) => self.file(channel, reply),
Read::Refusal(said) => self.notice = Some(Notice::Refused(said)),
Read::Unreadable(why) => self.notice = Some(Notice::Unreadable(why)),
}
}
fn file(&mut self, channel: &Channel, reply: Reply) {
match reply {
Reply::Workspaces(view) => self.seat(channel, view),
Reply::Conversations(rows) => {
self.convs = rows;
self.answered = self.aim.clone();
self.resolve();
}
Reply::Roles(rows) => self.roles = Some(rows),
Reply::Attention(rows) => self.asking(channel, rows),
Reply::Steps(listing) => self.steps = Some(listing),
Reply::Files(answer) => self.files = Some(answer),
Reply::Transcript(transcript) => self.transcript = transcript,
Reply::Follow(stream) => self.live = Some(stream),
Reply::Enrolled(material) => self.enrolled(&material),
Reply::Prepared(prepared) => self.fire(&prepared),
Reply::Started { conversation } => self.started(conversation),
Reply::Nudged | Reply::Flagged => self.notice = None,
Reply::Outcome(outcome) => {
self.notice = (!outcome.ok()).then_some(Notice::Refused(outcome.stderr));
}
}
}
fn seat(&mut self, channel: &Channel, view: crate::reply::roster::Workspaces) {
let seated = Chunk {
channel: channel.clone(),
held: Held::Heard,
stale: view.stale,
growth: view.growth,
walls: view.rows,
};
match self
.roster
.iter_mut()
.find(|chunk| chunk.channel.name == channel.name)
{
Some(held) => *held = seated,
None => self.roster.push(seated),
}
}
pub fn unreachable(&mut self, channel: &Channel, why: String) {
match self
.roster
.iter_mut()
.find(|chunk| chunk.channel.name == channel.name)
{
Some(held) => held.held = Held::Unheld(why),
None => self.notice = Some(Notice::Unreachable(format!("{}: {why}", channel.name))),
}
}
}