use serde_json::Value;
use crate::reply::Read;
use crate::ui::{Aim, Channel, Model};
#[derive(Debug, Clone)]
pub struct Heard {
pub channel: Channel,
pub said: Said,
}
#[derive(Debug, Clone)]
pub enum Said {
Frame(Value),
Live { conversation: String, read: Read },
Unreachable(String),
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct Standing {
pub channels: Vec<Channel>,
pub aim: Option<Aim>,
pub tuning: bool,
pub records: bool,
pub conversation: Option<String>,
}
impl Standing {
pub fn of(model: &Model) -> Self {
Self {
channels: model
.roster
.iter()
.map(|chunk| chunk.channel.clone())
.collect(),
aim: model.aim.clone(),
tuning: model.tuning.is_some(),
records: model.records,
conversation: model.asked(),
}
}
pub fn aimed(&self) -> Option<(Channel, Aim)> {
let aim = self.aim.clone()?;
let held = self.channels.iter().find(|held| held.name == aim.channel)?;
Some((held.clone(), aim))
}
}