use std::path::PathBuf;
use crossbeam_channel::Sender;
use crossterm::event::Event as CrosstermEvent;
use super::{
completion_generation::CompletionGeneration, shutdown_generation::ShutdownGeneration,
spawn_generation::SpawnGeneration,
};
use crate::domain::{port::OutputSink, pty::ProcessOutput, value::PaneId};
pub enum RuntimeEvent {
Input(CrosstermEvent),
Output {
pane: PaneId,
generation: SpawnGeneration,
output: ProcessOutput,
},
Respawn {
pane: PaneId,
generation: SpawnGeneration,
},
ForceStop {
pane: PaneId,
spawn_generation: SpawnGeneration,
shutdown_generation: ShutdownGeneration,
},
Completions {
generation: CompletionGeneration,
candidates: Vec<String>,
},
ConfigChanged {
path: PathBuf,
},
InputClosed,
}
pub struct ChannelOutputSink {
pane: PaneId,
generation: SpawnGeneration,
sender: Sender<RuntimeEvent>,
}
impl ChannelOutputSink {
pub fn new(pane: PaneId, generation: SpawnGeneration, sender: Sender<RuntimeEvent>) -> Self {
Self {
pane,
generation,
sender,
}
}
}
impl OutputSink for ChannelOutputSink {
fn send(&self, output: ProcessOutput) {
let _ = self.sender.send(RuntimeEvent::Output {
pane: self.pane,
generation: self.generation,
output,
});
}
}