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}