use indicatrix_net::messages::{PreviewConfig, StreamConfig, TransferMode};
use serde::{Deserialize, Serialize};
use std::path::{Path, PathBuf};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
pub enum PreviewScale {
Full,
Half,
#[default]
Quarter,
Custom(u32),
}
impl PreviewScale {
#[must_use]
pub const fn percent(self) -> u32 {
match self {
Self::Full => 100,
Self::Half => 50,
Self::Quarter => 25,
Self::Custom(p) => {
if p == 0 {
1
} else if p > 100 {
100
} else {
p
}
}
}
}
#[must_use]
pub fn resolve(self, width: u32, height: u32) -> (u32, u32) {
let pct = self.percent();
let w = (width * pct / 100).max(1);
let h = (height * pct / 100).max(1);
(w, h)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
pub enum LocalPreviewScale {
#[default]
Off,
Half,
Quarter,
}
impl LocalPreviewScale {
#[must_use]
pub const fn divisor(self) -> u32 {
match self {
Self::Off => 1,
Self::Half => 2,
Self::Quarter => 4,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
pub enum LiveComputeTarget {
LocalOnly,
RemoteOnly,
#[default]
Both,
}
pub const DEFAULT_WORKER_CADENCE_MS: u32 = 500;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(default)]
pub struct WorkerSettings {
pub name: String,
pub address: String,
pub cert_dir: String,
pub transfer_mode: TransferMode,
pub cadence_ms: u32,
pub preview_scale: PreviewScale,
}
impl Default for WorkerSettings {
fn default() -> Self {
Self {
name: String::new(),
address: String::new(),
cert_dir: String::new(),
transfer_mode: TransferMode::LiveProgressive,
cadence_ms: DEFAULT_WORKER_CADENCE_MS,
preview_scale: PreviewScale::Quarter,
}
}
}
impl WorkerSettings {
#[must_use]
pub fn ca_path(&self) -> PathBuf {
Path::new(&self.cert_dir).join("ca.pem")
}
#[must_use]
pub fn client_cert_path(&self) -> PathBuf {
Path::new(&self.cert_dir).join("client.pem")
}
#[must_use]
pub fn client_key_path(&self) -> PathBuf {
Path::new(&self.cert_dir).join("client.key")
}
#[must_use]
pub const fn effective_cadence_ms(&self, min_cadence_ms: u32) -> u32 {
if self.cadence_ms < min_cadence_ms {
min_cadence_ms
} else {
self.cadence_ms
}
}
#[must_use]
pub fn stream_config(&self, min_cadence_ms: u32, width: u32, height: u32) -> StreamConfig {
let (preview_width, preview_height) = self.preview_scale.resolve(width, height);
StreamConfig {
transfer_mode: self.transfer_mode,
cadence_ms: self.effective_cadence_ms(min_cadence_ms),
preview: Some(PreviewConfig {
width: preview_width,
height: preview_height,
}),
}
}
#[must_use]
pub fn export_stream_config(&self, min_cadence_ms: u32) -> StreamConfig {
StreamConfig {
transfer_mode: TransferMode::FinalOnly,
cadence_ms: self
.effective_cadence_ms(min_cadence_ms)
.max(EXPORT_CADENCE_MS),
preview: None,
}
}
}
pub const EXPORT_CADENCE_MS: u32 = 2000;