1use std::fmt;
2
3use serde::{Deserialize, Serialize};
4
5use crate::{PaneTargetRef, SessionName};
6
7#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
9pub enum WebShareRequest {
10 Create(CreateWebShareRequest),
12 List(ListWebSharesRequest),
14 Stop(StopWebShareRequest),
16 StopAll(StopAllWebSharesRequest),
18 Lookup(LookupWebShareRequest),
20 Config(WebShareConfigRequest),
22}
23
24#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
26pub struct CreateWebShareRequest {
27 pub scope: WebShareScope,
29 #[serde(default)]
31 pub public_base_url: Option<String>,
32 #[serde(default)]
34 pub tunnel_provider: Option<String>,
35 #[serde(default)]
37 pub frontend_url: Option<String>,
38 #[serde(default)]
40 pub ttl_seconds: Option<u64>,
41 #[serde(default)]
43 pub expires_at_unix: Option<u64>,
44 #[serde(default)]
46 pub max_spectators: Option<u16>,
47 #[serde(default)]
49 pub max_operators: Option<u16>,
50 #[serde(default)]
52 pub url_options: WebShareUrlOptions,
53 #[serde(default = "default_true")]
55 pub require_pin: bool,
56 #[serde(default)]
58 pub operator_pin: Option<String>,
59 #[serde(default)]
61 pub spectator_pin: Option<String>,
62 #[serde(default)]
64 pub terminal_palette: Option<Box<WebTerminalPalette>>,
65 #[serde(default = "default_true")]
67 pub operator: bool,
68 #[serde(default = "default_true")]
70 pub spectator: bool,
71 #[serde(default)]
73 pub controls: bool,
74 #[serde(default)]
76 pub kill_session_on_expire: bool,
77}
78
79#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
81#[serde(rename_all = "snake_case")]
82pub enum WebShareScope {
83 Pane(PaneTargetRef),
85 Session(SessionName),
87}
88
89impl WebShareScope {
90 #[must_use]
92 pub const fn is_pane(&self) -> bool {
93 matches!(self, Self::Pane(_))
94 }
95
96 #[must_use]
98 pub const fn is_session(&self) -> bool {
99 matches!(self, Self::Session(_))
100 }
101}
102
103impl fmt::Display for WebShareScope {
104 fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
105 match self {
106 Self::Pane(target) => target.fmt(formatter),
107 Self::Session(session_name) => session_name.fmt(formatter),
108 }
109 }
110}
111
112#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
114pub struct WebShareUrlOptions {
115 #[serde(default)]
117 pub no_navbar: bool,
118 #[serde(default)]
120 pub no_disclaimer: bool,
121 #[serde(default = "default_show_viewers")]
123 pub show_viewers: bool,
124 #[serde(default)]
126 pub terminal_theme: Option<WebTerminalTheme>,
127}
128
129impl Default for WebShareUrlOptions {
130 fn default() -> Self {
131 Self {
132 no_navbar: false,
133 no_disclaimer: false,
134 show_viewers: true,
135 terminal_theme: None,
136 }
137 }
138}
139
140const fn default_show_viewers() -> bool {
141 true
142}
143
144const fn default_true() -> bool {
145 true
146}
147
148#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
150#[serde(rename_all = "kebab-case")]
151pub enum WebTerminalTheme {
152 User,
154 Light,
156 Dark,
158}
159
160impl WebTerminalTheme {
161 #[must_use]
163 pub const fn as_url_value(self) -> &'static str {
164 match self {
165 Self::User => "user",
166 Self::Light => "light",
167 Self::Dark => "dark",
168 }
169 }
170}
171
172#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
174pub struct WebTerminalPalette {
175 pub foreground: String,
177 pub background: String,
179 pub cursor: String,
181 pub ansi: [String; 16],
183}
184
185#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
187pub struct ListWebSharesRequest;
188
189#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
191pub struct StopWebShareRequest {
192 pub share_id: String,
194}
195
196#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
198pub struct StopAllWebSharesRequest;
199
200#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
202pub struct LookupWebShareRequest {
203 pub share_id: String,
205}
206
207#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
209pub struct WebShareConfigRequest;