use crate::reply::convs::ConvRow;
use crate::reply::stream::Stream;
use crate::reply::transcript::Transcript;
mod absorb;
mod acts;
mod channel;
mod claim;
mod enroll;
mod fill;
mod login;
mod notice;
mod posted;
mod queue;
mod records;
mod start;
mod tuning;
mod unmake;
mod window;
pub use channel::{Channel, Chunk, Held};
pub use enroll::{Enrolling, Grade, Shown};
pub use fill::Fill;
pub use login::Login;
pub use notice::Notice;
pub use posted::Posted;
pub use queue::Asking;
pub use start::{Phase, Start};
pub use tuning::{Edit, Tuning};
pub use unmake::Unmaking;
pub use window::{Hits, Lookup, Pages};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Aim {
pub channel: String,
pub address: String,
}
#[derive(Debug, Clone, Default)]
pub struct Model {
pub roster: Vec<Chunk>,
pub convs: Vec<ConvRow>,
pub answered: Option<Aim>,
pub roles: Option<Vec<crate::reply::roles::RoleRow>>,
pub tuning: Option<Tuning>,
pub records: bool,
pub login: Option<Login>,
pub providers: Option<Vec<crate::reply::providers::ProviderRow>>,
pub offered: Option<Vec<String>>,
pub signin: Option<crate::reply::login::Signin>,
pub queue: bool,
pub lookup: Option<Lookup>,
pub unmaking: Option<Unmaking>,
pub waiting: Vec<Asking>,
pub pages: Vec<Pages>,
pub found: Vec<Hits>,
pub needle: String,
pub steps: Option<crate::reply::steps::Steps>,
pub files: Option<crate::reply::files::Files>,
pub transcript: Transcript,
pub live: Option<Stream>,
pub notice: Option<Notice>,
pub aim: Option<Aim>,
pub focus: crate::ui::keys::Pane,
pub column: crate::ui::Column,
pub reveal: bool,
pub conversation: Option<String>,
pub draft: String,
pub typed: String,
pub fill: Option<Fill>,
pub reason: String,
pub start: Option<Start>,
pub enroll: Option<Enrolling>,
pub outbox: Vec<Posted>,
}
impl Model {
pub fn revealing(&mut self, pane: crate::ui::keys::Pane) -> bool {
self.focus == pane && std::mem::take(&mut self.reveal)
}
pub fn holds(&self, channel: &str) -> bool {
self.roster
.iter()
.any(|chunk| chunk.channel.name == channel)
}
pub fn aimed_at(&self, channel: &str, address: Option<&String>) -> bool {
match (&self.aim, address) {
(Some(aim), Some(address)) => aim.channel == channel && aim.address == *address,
_ => false,
}
}
}
#[cfg(test)]
mod tests;