rmux 0.8.0

A local terminal multiplexer with a tmux-style CLI, daemon runtime, Rust SDK, and ratatui integration.
pub(super) const BINARY_CONTRACT_VERSION: u32 = 1;

pub(super) const JSON_COMMANDS: &[&str] = &[
    "capabilities",
    "display-message",
    "list-clients",
    "list-panes",
    "list-sessions",
    "list-windows",
];

pub(super) const CONTROL_NOTIFICATIONS: &[&str] = &[
    "%begin",
    "%end",
    "%error",
    "%output",
    "%extended-output",
    "%pause",
    "%continue",
    "%exit",
    "%message",
    "%config-error",
    "%window-add",
    "%window-close",
    "%window-renamed",
    "%unlinked-window-add",
    "%unlinked-window-close",
    "%unlinked-window-renamed",
    "%window-pane-changed",
    "%pane-mode-changed",
    "%layout-change",
    "%session-changed",
    "%session-renamed",
    "%session-window-changed",
    "%sessions-changed",
    "%client-session-changed",
    "%client-detached",
    "%paste-buffer-changed",
    "%paste-buffer-deleted",
];

#[cfg(test)]
mod tests {
    use std::collections::BTreeSet;

    use super::{CONTROL_NOTIFICATIONS, JSON_COMMANDS};

    #[test]
    fn json_commands_are_sorted_unique_and_stable() {
        assert_eq!(
            JSON_COMMANDS,
            [
                "capabilities",
                "display-message",
                "list-clients",
                "list-panes",
                "list-sessions",
                "list-windows",
            ]
        );
        assert_sorted_unique(JSON_COMMANDS);
    }

    #[test]
    fn control_notifications_are_unique_and_stable() {
        assert_eq!(
            CONTROL_NOTIFICATIONS,
            [
                "%begin",
                "%end",
                "%error",
                "%output",
                "%extended-output",
                "%pause",
                "%continue",
                "%exit",
                "%message",
                "%config-error",
                "%window-add",
                "%window-close",
                "%window-renamed",
                "%unlinked-window-add",
                "%unlinked-window-close",
                "%unlinked-window-renamed",
                "%window-pane-changed",
                "%pane-mode-changed",
                "%layout-change",
                "%session-changed",
                "%session-renamed",
                "%session-window-changed",
                "%sessions-changed",
                "%client-session-changed",
                "%client-detached",
                "%paste-buffer-changed",
                "%paste-buffer-deleted",
            ]
        );
        assert_unique(CONTROL_NOTIFICATIONS);
    }

    #[test]
    fn advertised_control_notifications_cover_control_emitters() {
        let emitted = emitted_control_prefixes();
        let advertised = CONTROL_NOTIFICATIONS
            .iter()
            .copied()
            .collect::<BTreeSet<_>>();
        for prefix in &emitted {
            assert!(
                advertised.contains(prefix),
                "control-mode emitter uses {prefix:?} but capabilities do not advertise it"
            );
        }
        for prefix in &advertised {
            assert!(
                emitted.contains(prefix),
                "capabilities advertise control-mode prefix {prefix:?} but no control emitter uses it"
            );
        }
    }

    fn emitted_control_prefixes() -> BTreeSet<&'static str> {
        [
            include_str!("../../crates/rmux-proto/src/control.rs"),
            include_str!("../../crates/rmux-server/src/control.rs"),
            include_str!("../../crates/rmux-server/src/control/subscriptions.rs"),
            include_str!("../../crates/rmux-server/src/control/output_queue.rs"),
            include_str!("../../crates/rmux-server/src/control_notifications.rs"),
            include_str!("../../crates/rmux-server/src/handler_control.rs"),
            include_str!("../../crates/rmux-server/src/handler_pane/inspection.rs"),
        ]
        .into_iter()
        .flat_map(control_prefixes_in_source)
        .collect()
    }

    fn control_prefixes_in_source(source: &'static str) -> BTreeSet<&'static str> {
        let mut prefixes = BTreeSet::new();
        let mut rest = source;
        while let Some(offset) = rest.find('%') {
            rest = &rest[offset..];
            let mut end = 1;
            for byte in rest.as_bytes().iter().copied().skip(1) {
                if byte.is_ascii_lowercase() || byte == b'-' {
                    end += 1;
                } else {
                    break;
                }
            }
            if end > 1 {
                prefixes.insert(&rest[..end]);
            }
            rest = &rest[end..];
        }
        prefixes
    }

    fn assert_sorted_unique(values: &[&str]) {
        for pair in values.windows(2) {
            assert!(pair[0] < pair[1], "{values:?} is not sorted");
        }
        assert_unique(values);
    }

    fn assert_unique(values: &[&str]) {
        let unique = values.iter().copied().collect::<BTreeSet<_>>();
        assert_eq!(unique.len(), values.len(), "{values:?} contains duplicates");
    }
}