rmux-server 0.10.0

Tokio daemon and request dispatcher for the RMUX terminal multiplexer.
Documentation
use rmux_proto::{Response, RmuxError, SessionId, SessionName};

use super::super::resolve_existing_session_target;
use super::queue::{QueueExecutionContext, QueueInvocation};
use crate::pane_terminals::HandlerState;

#[derive(Debug, Clone, PartialEq, Eq)]
pub(super) struct QueuedSessionRename {
    session_id: SessionId,
    old_name: SessionName,
    new_name: SessionName,
}

impl QueuedSessionRename {
    pub(super) fn capture(
        invocation: &QueueInvocation,
        state: &HandlerState,
    ) -> Result<Option<Self>, RmuxError> {
        let QueueInvocation::Request(rmux_proto::Request::RenameSession(request)) = invocation
        else {
            return Ok(None);
        };
        let old_name =
            resolve_existing_session_target(&state.sessions, "rename-session", &request.target)?;
        let session_id = state
            .sessions
            .session(&old_name)
            .expect("resolved queued rename target must exist")
            .id();
        Ok(Some(Self {
            session_id,
            old_name,
            new_name: request.new_name.clone(),
        }))
    }

    pub(super) fn commit(self, response: &Response) -> Option<Self> {
        matches!(
            response,
            Response::RenameSession(response) if response.session_name == self.new_name
        )
        .then_some(self)
    }

    pub(super) fn apply(&self, context: &mut QueueExecutionContext) {
        context.rebase_after_session_rename(self.session_id, &self.old_name, &self.new_name);
    }
}