use serde_json::Value;
use crate::channel::Reach;
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 },
Signin { provider: String, read: Read },
Unreachable(String),
Acted { op: String, reach: Reach },
Receipt { op: String, frame: Value },
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Open {
Tuning,
Records,
Queue,
Trail,
Board,
Clients,
Config(Option<crate::verbs::Where>),
Login(Option<String>),
}
impl Open {
fn of(model: &Model) -> Option<Self> {
if model.tuning.is_some() {
Some(Self::Tuning)
} else if model.showing(crate::ui::Listing::Records) {
Some(Self::Records)
} else if model.showing(crate::ui::Listing::Queue) {
Some(Self::Queue)
} else if model.trailing() {
Some(Self::Trail)
} else if model.boarding() {
Some(Self::Board)
} else if model.login.is_some() {
Some(Self::Login(model.following()))
} else if model.showing(crate::ui::Listing::Clients) {
Some(Self::Clients)
} else if model.configuring.is_some() {
Some(Self::Config(model.configured()))
} else {
None
}
}
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct Standing {
pub channels: Vec<Channel>,
pub aim: Option<Aim>,
pub open: Option<Open>,
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(),
open: Open::of(model),
conversation: model.asked(),
}
}
pub fn standing(&self, pane: &Open) -> bool {
self.open.as_ref() == Some(pane)
}
pub fn at(&self) -> Option<crate::verbs::Where> {
match &self.open {
Some(Open::Config(at)) => at.clone(),
_ => None,
}
}
pub fn signin(&self) -> Option<String> {
match &self.open {
Some(Open::Login(provider)) => provider.clone(),
_ => None,
}
}
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))
}
}