1use std::path::PathBuf;
2
3use clap::{Parser, ValueEnum};
4
5#[derive(Debug, Clone, Parser)]
6#[command(
7 name = "screen-record",
8 version,
9 about = "Record a single window or display on macOS (12+) or Linux (X11/Wayland portal)."
10)]
11pub struct Cli {
12 #[arg(long)]
14 pub screenshot: bool,
15
16 #[arg(long)]
18 pub portal: bool,
19
20 #[arg(long)]
22 pub list_windows: bool,
23
24 #[arg(long)]
26 pub list_displays: bool,
27
28 #[arg(long)]
30 pub list_apps: bool,
31
32 #[arg(long)]
34 pub preflight: bool,
35
36 #[arg(long)]
38 pub request_permission: bool,
39
40 #[arg(long, value_name = "id")]
42 pub window_id: Option<u32>,
43
44 #[arg(long, value_name = "name")]
46 pub app: Option<String>,
47
48 #[arg(long, value_name = "name", requires = "app")]
50 pub window_name: Option<String>,
51
52 #[arg(long)]
54 pub active_window: bool,
55
56 #[arg(long)]
58 pub display: bool,
59
60 #[arg(long, value_name = "id")]
62 pub display_id: Option<u32>,
63
64 #[arg(long, value_name = "seconds")]
66 pub duration: Option<u64>,
67
68 #[arg(long, value_enum, default_value_t = AudioMode::Off)]
70 pub audio: AudioMode,
71
72 #[arg(long, value_name = "path")]
74 pub path: Option<PathBuf>,
75
76 #[arg(long, value_name = "path")]
78 pub metadata_out: Option<PathBuf>,
79
80 #[arg(long, value_name = "path")]
82 pub diagnostics_out: Option<PathBuf>,
83
84 #[arg(long, value_enum)]
86 pub format: Option<ContainerFormat>,
87
88 #[arg(long, value_enum)]
90 pub image_format: Option<ImageFormat>,
91
92 #[arg(long, value_name = "path")]
94 pub dir: Option<PathBuf>,
95
96 #[arg(long)]
98 pub if_changed: bool,
99
100 #[arg(long, value_name = "path", requires = "if_changed")]
102 pub if_changed_baseline: Option<PathBuf>,
103
104 #[arg(
106 long,
107 value_name = "bits",
108 value_parser = clap::value_parser!(u32).range(0..=64),
109 requires = "if_changed"
110 )]
111 pub if_changed_threshold: Option<u32>,
112}
113
114#[derive(Debug, Clone, Copy, PartialEq, Eq, ValueEnum)]
115pub enum AudioMode {
116 Off,
117 System,
118 Mic,
119 Both,
120}
121
122#[derive(Debug, Clone, Copy, PartialEq, Eq, ValueEnum)]
123pub enum ContainerFormat {
124 Mov,
125 Mp4,
126}
127
128#[derive(Debug, Clone, Copy, PartialEq, Eq, ValueEnum)]
129pub enum ImageFormat {
130 Png,
131 #[value(alias = "jpeg")]
132 Jpg,
133 Webp,
134}