use std::fmt;
use crate::{
input::{InputId, InputRequest, InputResult},
types::{StateRevision, TerminalDelta, TerminalSnapshot, TerminalState},
};
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum SessionStatus {
Connecting,
Live,
Recovering,
Suspended,
Closed,
Failed,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum SnapshotRequiredReason {
NoBase,
RevisionGap,
InvalidDelta,
}
#[derive(Clone, Copy, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub struct CommitReceipt(pub(crate) u64);
impl CommitReceipt {
pub const fn get(self) -> u64 {
self.0
}
}
impl fmt::Debug for CommitReceipt {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str("CommitReceipt(<opaque>)")
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum AcknowledgeResult {
Committed,
Duplicate,
RejectedStale,
RejectedUnknown,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum TerminalEffect {
PrimaryScroll { rows: Vec<crate::PrimaryScrollRow> },
Screen { alternate: bool },
InputModes { modes: u16 },
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum SessionEvent {
Snapshot {
snapshot: TerminalSnapshot,
},
Delta {
delta: TerminalDelta,
effects: Vec<TerminalEffect>,
receipt: Option<CommitReceipt>,
},
SnapshotRequired {
expected: StateRevision,
received: StateRevision,
reason: SnapshotRequiredReason,
},
StatusChanged(SessionStatus),
InputQueued {
request: InputRequest,
},
InputCompleted {
id: InputId,
outcome: crate::InputOutcome,
},
ConsumerStalled,
}
impl SessionEvent {
pub fn snapshot_state(&self) -> Option<&TerminalState> {
match self {
Self::Snapshot { snapshot } => Some(&snapshot.state),
_ => None,
}
}
pub fn input_result(&self) -> Option<InputResult> {
match self {
Self::InputCompleted { id, outcome } => Some(InputResult {
id: *id,
outcome: *outcome,
}),
_ => None,
}
}
}