rmux-server 0.1.1

Tokio daemon and request dispatcher for the RMUX terminal multiplexer.
Documentation
use std::collections::HashMap;

use rmux_core::{PaneId, Session};
use rmux_proto::{RmuxError, SessionName};

use crate::pane_terminal_process::PaneTerminal;

use super::{HandlerState, RemovedPaneOutputs};

impl HandlerState {
    pub(in crate::pane_terminals) fn replace_session(
        &mut self,
        session_name: &SessionName,
        previous_session: Session,
    ) -> Result<(), RmuxError> {
        let session = self.sessions.session_mut(session_name).ok_or_else(|| {
            RmuxError::Server(format!(
                "failed to roll back session {session_name}: session disappeared"
            ))
        })?;
        *session = previous_session;
        Ok(())
    }

    pub(in crate::pane_terminals) fn restore_session_after_resize_error(
        &mut self,
        session_name: &SessionName,
        previous_session: Session,
        source_error: &RmuxError,
    ) -> Result<(), RmuxError> {
        self.replace_session(session_name, previous_session)?;
        self.resize_terminals(session_name)
            .map_err(|rollback_error| {
                RmuxError::Server(format!(
                "failed to roll back session {session_name} after {source_error}: {rollback_error}"
            ))
            })
    }

    pub(in crate::pane_terminals) fn restore_session_and_panes_after_resize_error(
        &mut self,
        session_name: &SessionName,
        previous_session: Session,
        removed_terminals: HashMap<PaneId, PaneTerminal>,
        removed_outputs: RemovedPaneOutputs,
        source_error: &RmuxError,
    ) -> Result<(), RmuxError> {
        self.replace_session(session_name, previous_session)?;
        self.terminals
            .insert_existing_panes(session_name, removed_terminals)
            .map_err(|rollback_error| {
                RmuxError::Server(format!(
                    "failed to restore pane terminals for session {session_name} after {source_error}: {rollback_error}"
                ))
            })?;
        self.insert_existing_pane_outputs(session_name, removed_outputs);
        self.resize_terminals(session_name)
            .map_err(|rollback_error| {
                RmuxError::Server(format!(
                    "failed to roll back session {session_name} after {source_error}: {rollback_error}"
                ))
            })
    }
}