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 session_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#[non_exhaustive]
47#[serde(tag = "type", content = "payload", rename_all = "snake_case")]
48pub enum CaptureError {
49 NotATmuxTarget,
50 PaneUnavailable,
51 SessionMissing,
52 TmuxNotAvailable,
53 CapturePaneFailed { stderr: String },
54}
55
56#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
57#[non_exhaustive]
58#[serde(tag = "status", content = "payload", rename_all = "snake_case")]
59pub enum CaptureResponse {
60 Captured(PaneSnapshot),
61 Failed(CaptureError),
62}
63
64impl CaptureResponse {
65 pub fn into_result(self) -> Result<PaneSnapshot, CaptureError> {
66 match self {
67 Self::Captured(snapshot) => Ok(snapshot),
68 Self::Failed(error) => Err(error),
69 }
70 }
71}