libtmux 0.1.0

Async typed tmux client and object model
Documentation
//! Native daemon eligibility for positive feature fixtures.

#![allow(dead_code, clippy::expect_used)]

use libtmux::test::TestServer;
use libtmux::{ReleaseVersion, Server, TmuxVersion};

async fn daemon_version(server: &Server) -> TmuxVersion {
    let report = server
        .format(None, "tmux #{version}")
        .await
        .expect("daemon release");
    let mut report = report.as_bytes().to_vec();
    report.push(b'\n');
    TmuxVersion::parse_output(&report).expect("numbered daemon release")
}

pub(crate) async fn supports(server: &Server, needs: &ReleaseVersion) -> bool {
    daemon_version(server).await.has_behavior(needs)
}

pub(crate) async fn supports_control(server: &Server) -> bool {
    daemon_version(server)
        .await
        .has_behavior(&libtmux::since::CONTROL_ACQUISITION)
}

pub(crate) async fn feature_fixture(
    guard: TestServer,
    needs: &ReleaseVersion,
) -> Option<TestServer> {
    if supports(guard.server(), needs).await {
        Some(guard)
    } else {
        eprintln!("positive feature fixture needs tmux {needs}");
        guard.shutdown().await.expect("ineligible fixture closes");
        None
    }
}

pub(crate) async fn control_fixture(guard: TestServer) -> Option<TestServer> {
    if supports_control(guard.server()).await {
        Some(guard)
    } else {
        eprintln!("positive control fixture needs tmux 3.7 or newer");
        guard.shutdown().await.expect("ineligible fixture closes");
        None
    }
}