use std::fmt;
use serde::{Deserialize, Serialize};
use crate::{PaneTargetRef, SessionName};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum WebShareRequest {
Create(CreateWebShareRequest),
List(ListWebSharesRequest),
Stop(StopWebShareRequest),
StopAll(StopAllWebSharesRequest),
Lookup(LookupWebShareRequest),
Config(WebShareConfigRequest),
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct CreateWebShareRequest {
pub scope: WebShareScope,
#[serde(default)]
pub public_base_url: Option<String>,
#[serde(default)]
pub tunnel_provider: Option<String>,
#[serde(default)]
pub frontend_url: Option<String>,
#[serde(default)]
pub ttl_seconds: Option<u64>,
#[serde(default)]
pub expires_at_unix: Option<u64>,
#[serde(default)]
pub max_spectators: Option<u16>,
#[serde(default)]
pub max_operators: Option<u16>,
#[serde(default)]
pub url_options: WebShareUrlOptions,
#[serde(default = "default_true")]
pub require_pin: bool,
#[serde(default)]
pub operator_pin: Option<String>,
#[serde(default)]
pub spectator_pin: Option<String>,
#[serde(default)]
pub terminal_palette: Option<Box<WebTerminalPalette>>,
#[serde(default = "default_true")]
pub operator: bool,
#[serde(default = "default_true")]
pub spectator: bool,
#[serde(default)]
pub controls: bool,
#[serde(default)]
pub kill_session_on_expire: bool,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum WebShareScope {
Pane(PaneTargetRef),
Session(SessionName),
}
impl WebShareScope {
#[must_use]
pub const fn is_pane(&self) -> bool {
matches!(self, Self::Pane(_))
}
#[must_use]
pub const fn is_session(&self) -> bool {
matches!(self, Self::Session(_))
}
}
impl fmt::Display for WebShareScope {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Pane(target) => target.fmt(formatter),
Self::Session(session_name) => session_name.fmt(formatter),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub struct WebShareUrlOptions {
#[serde(default)]
pub no_navbar: bool,
#[serde(default)]
pub no_disclaimer: bool,
#[serde(default = "default_show_viewers")]
pub show_viewers: bool,
#[serde(default)]
pub terminal_theme: Option<WebTerminalTheme>,
}
impl Default for WebShareUrlOptions {
fn default() -> Self {
Self {
no_navbar: false,
no_disclaimer: false,
show_viewers: true,
terminal_theme: None,
}
}
}
const fn default_show_viewers() -> bool {
true
}
const fn default_true() -> bool {
true
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum WebTerminalTheme {
User,
Light,
Dark,
}
impl WebTerminalTheme {
#[must_use]
pub const fn as_url_value(self) -> &'static str {
match self {
Self::User => "user",
Self::Light => "light",
Self::Dark => "dark",
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct WebTerminalPalette {
pub foreground: String,
pub background: String,
pub cursor: String,
pub ansi: [String; 16],
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct ListWebSharesRequest;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct StopWebShareRequest {
pub share_id: String,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct StopAllWebSharesRequest;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct LookupWebShareRequest {
pub share_id: String,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct WebShareConfigRequest;