lilo-rm-core 0.3.0

Runtime Matters core protocol types and JSON line wire contract for rtmd clients
Documentation
use std::path::PathBuf;

use serde::{Deserialize, Serialize};
use uuid::Uuid;

#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(tag = "type", content = "payload", rename_all = "snake_case")]
pub enum LogAvailability {
    Headless {
        stdout_path: PathBuf,
        stderr_path: PathBuf,
    },
    TmuxPaneSnapshot,
    Unavailable {
        reason: LogsUnavailableReason,
    },
}

#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum LogsUnavailableReason {
    TmuxTarget,
    CaptureDisabled,
    PaneUnavailable,
    PipeInUse,
    RecorderFailed,
}

#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct CaptureRequest {
    pub target_id: Uuid,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub scrollback_lines: Option<u32>,
}

#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct PaneSnapshot {
    pub content: String,
    pub captured_at_ms: u64,
    pub scrollback_lines_requested: u32,
    pub scrollback_lines_included: u32,
    pub pane_history_lines: u32,
}

#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(tag = "type", content = "payload", rename_all = "snake_case")]
pub enum CaptureError {
    NotATmuxTarget,
    PaneUnavailable,
    SessionMissing,
    TmuxNotAvailable,
    CapturePaneFailed { stderr: String },
}

#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(tag = "status", content = "payload", rename_all = "snake_case")]
pub enum CaptureResponse {
    Captured(PaneSnapshot),
    Failed(CaptureError),
}

impl CaptureResponse {
    pub fn into_result(self) -> Result<PaneSnapshot, CaptureError> {
        match self {
            Self::Captured(snapshot) => Ok(snapshot),
            Self::Failed(error) => Err(error),
        }
    }
}