rmux-server 0.1.1

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

use crate::format_runtime::{render_runtime_template, RuntimeFormatContext};
use crate::pane_terminals::HandlerState;

use super::parse::ParsedDisplayPopupCommand;
use super::PromptInputEvent;

pub(super) fn popup_shell_command(
    state: &HandlerState,
    session_name: &rmux_proto::SessionName,
    command: &ParsedDisplayPopupCommand,
    runtime: &RuntimeFormatContext<'_>,
) -> Result<Option<String>, RmuxError> {
    if command.no_job {
        return Ok(None);
    }
    if let Some(command_text) = &command.command {
        return Ok(Some(render_runtime_template(command_text, runtime, false)));
    }
    let default = state
        .options
        .resolve(Some(session_name), OptionName::DefaultCommand)
        .unwrap_or_default();
    if default.is_empty() {
        Ok(None)
    } else {
        Ok(Some(render_runtime_template(default, runtime, false)))
    }
}

pub(super) fn find_window_target_by_id(
    state: &HandlerState,
    session_name: &rmux_proto::SessionName,
    window_id: u32,
) -> Option<WindowTarget> {
    let session = state.sessions.session(session_name)?;
    session
        .windows()
        .iter()
        .find_map(|(window_index, window)| {
            (window.id().as_u32() == window_id).then_some(*window_index)
        })
        .map(|window_index| WindowTarget::with_window(session_name.clone(), window_index))
}

pub(super) fn find_session_name_by_id(
    state: &HandlerState,
    session_id: u32,
) -> Option<rmux_proto::SessionName> {
    state.sessions.iter().find_map(|(session_name, session)| {
        (session.id().as_u32() == session_id).then_some(session_name.clone())
    })
}

pub(super) fn decode_prompt_key_guess(bytes: &[u8]) -> Option<PromptInputEvent> {
    super::super::pane_support::decode_prompt_input_event(bytes).map(|(event, _)| event)
}