use crate::state::{assignment::Assignment, pty::PtyScrollback};
use std::sync::Arc;
use tab_api::{
chunk::{InputChunk, OutputChunk},
tab::{TabId, TabMetadata},
};
#[derive(Debug, Clone, Eq)]
pub struct TabInput {
pub id: TabId,
pub stdin: Arc<InputChunk>,
}
impl PartialEq for TabInput {
fn eq(&self, other: &Self) -> bool {
self.id == other.id && *self.stdin == *other.stdin
}
}
impl TabInput {
#[cfg(test)]
pub fn new(id: TabId, data: Vec<u8>) -> Self {
Self {
id,
stdin: Arc::new(InputChunk { data }),
}
}
}
#[derive(Debug, Clone)]
pub struct TabOutput {
pub id: TabId,
pub stdout: Arc<OutputChunk>,
}
impl PartialEq for TabOutput {
fn eq(&self, other: &Self) -> bool {
self.id == other.id && *self.stdout == *other.stdout
}
}
impl Eq for TabOutput {
fn assert_receiver_is_total_eq(&self) {}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum TabRecv {
Assign(Assignment<TabMetadata>),
Scrollback(TabId),
Resize(TabId, (u16, u16)),
Retask(TabId, Option<TabId>),
Input(TabInput),
Terminate(TabId),
TerminateAll,
}
#[derive(Debug, Clone)]
pub struct TabScrollback {
pub id: TabId,
pub scrollback: PtyScrollback,
}
impl Eq for TabScrollback {
fn assert_receiver_is_total_eq(&self) {}
}
impl PartialEq for TabScrollback {
fn eq(&self, other: &Self) -> bool {
self.id == other.id
}
}
impl TabScrollback {
#[cfg(test)]
pub fn empty(id: TabId) -> Self {
Self {
id,
scrollback: PtyScrollback::empty(),
}
}
#[cfg(test)]
pub async fn push(&self, chunk: OutputChunk) {
self.scrollback.push(chunk).await;
}
pub async fn scrollback(&self) -> impl Iterator<Item = OutputChunk> {
self.scrollback.scrollback().await
}
}
#[derive(Debug, Clone)]
pub enum TabSend {
Started(TabMetadata),
Scrollback(TabScrollback),
Retask(TabId, Option<TabId>),
Output(TabOutput),
Stopped(TabId),
}