use std::sync::Arc;
use crate::cmd::run_exec_process;
use super::Terminal;
use super::registry::{AppRuntime, AppSink};
use super::terminal_controller::TerminalController;
pub(crate) struct RuntimeBridge;
impl RuntimeBridge {
pub(crate) fn handle_exec_requests(
terminal: &mut Terminal,
runtime: &Arc<AppRuntime>,
) -> std::io::Result<()> {
let exec_requests = runtime.take_exec_requests();
for request in exec_requests {
terminal.suspend()?;
let result = run_exec_process(&request.config);
terminal.resume()?;
(request.callback)(result);
runtime.request_render();
}
Ok(())
}
pub(crate) fn handle_terminal_commands(
terminal: &mut Terminal,
runtime: &Arc<AppRuntime>,
last_width: &mut u16,
last_height: &mut u16,
) -> std::io::Result<()> {
let terminal_cmds = runtime.take_terminal_cmds();
for cmd in terminal_cmds {
TerminalController::handle_terminal_cmd(
terminal,
runtime,
cmd,
last_width,
last_height,
)?;
}
Ok(())
}
pub(crate) fn handle_mode_switch_request(
terminal: &mut Terminal,
runtime: &Arc<AppRuntime>,
) -> std::io::Result<()> {
if let Some(mode_switch) = runtime.take_mode_switch_request() {
TerminalController::handle_mode_switch(terminal, runtime, mode_switch)?;
}
Ok(())
}
pub(crate) fn handle_println_messages(
terminal: &mut Terminal,
runtime: &Arc<AppRuntime>,
) -> std::io::Result<()> {
let messages = runtime.take_println_messages();
if !messages.is_empty() {
TerminalController::handle_println_messages(terminal, &messages)?;
}
Ok(())
}
}