Skip to main content

lilo_rm_core/
capture.rs

1use std::path::PathBuf;
2
3use serde::{Deserialize, Serialize};
4use uuid::Uuid;
5
6#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
7#[serde(tag = "type", content = "payload", rename_all = "snake_case")]
8pub enum LogAvailability {
9    Headless {
10        stdout_path: PathBuf,
11        stderr_path: PathBuf,
12    },
13    TmuxPaneSnapshot,
14    Unavailable {
15        reason: LogsUnavailableReason,
16    },
17}
18
19#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
20#[serde(rename_all = "snake_case")]
21pub enum LogsUnavailableReason {
22    TmuxTarget,
23    CaptureDisabled,
24    PaneUnavailable,
25    PipeInUse,
26    RecorderFailed,
27}
28
29#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
30pub struct CaptureRequest {
31    pub target_id: Uuid,
32    #[serde(default, skip_serializing_if = "Option::is_none")]
33    pub scrollback_lines: Option<u32>,
34}
35
36#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
37pub struct PaneSnapshot {
38    pub content: String,
39    pub captured_at_ms: u64,
40    pub scrollback_lines_requested: u32,
41    pub scrollback_lines_included: u32,
42    pub pane_history_lines: u32,
43}
44
45#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
46#[serde(tag = "type", content = "payload", rename_all = "snake_case")]
47pub enum CaptureError {
48    NotATmuxTarget,
49    PaneUnavailable,
50    SessionMissing,
51    TmuxNotAvailable,
52    CapturePaneFailed { stderr: String },
53}
54
55#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
56#[serde(tag = "status", content = "payload", rename_all = "snake_case")]
57pub enum CaptureResponse {
58    Captured(PaneSnapshot),
59    Failed(CaptureError),
60}
61
62impl CaptureResponse {
63    pub fn into_result(self) -> Result<PaneSnapshot, CaptureError> {
64        match self {
65            Self::Captured(snapshot) => Ok(snapshot),
66            Self::Failed(error) => Err(error),
67        }
68    }
69}