use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AppConfig {
pub identifier: String,
pub name: String,
pub version: String,
#[serde(default)]
pub renderer: RendererConfig,
#[serde(default)]
pub window: WindowConfig,
#[serde(default)]
pub dev: DevConfig,
#[serde(default)]
pub bundle: BundleConfig,
#[serde(default)]
pub commands: HashMap<String, CommandConfig>,
#[serde(default)]
pub hotkeys: Vec<HotkeyConfig>,
#[serde(default)]
pub global_input: GlobalInputConfig,
}
impl Default for AppConfig {
fn default() -> Self {
Self {
identifier: "com.example.app".to_string(),
name: "rdesktop App".to_string(),
version: "0.1.0".to_string(),
renderer: RendererConfig::default(),
window: WindowConfig::default(),
dev: DevConfig::default(),
bundle: BundleConfig::default(),
commands: HashMap::new(),
hotkeys: Vec::new(),
global_input: GlobalInputConfig::default(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum RendererKind {
#[serde(rename = "webview")]
WebView,
#[serde(rename = "chrome")]
Chrome,
}
impl Default for RendererKind {
fn default() -> Self {
Self::WebView
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RendererConfig {
#[serde(default)]
pub kind: RendererKind,
#[serde(default = "default_true")]
pub webgpu: bool,
}
impl Default for RendererConfig {
fn default() -> Self {
Self {
kind: RendererKind::default(),
webgpu: true,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DevConfig {
#[serde(default = "default_dev_port")]
pub port: u16,
#[serde(default = "default_dev_host")]
pub host: String,
#[serde(default = "default_true")]
pub open_browser: bool,
#[serde(default = "default_true")]
pub hot_reload: bool,
#[serde(default = "default_true")]
pub agent_mode: bool,
#[serde(default = "default_true")]
pub devtools: bool,
}
impl Default for DevConfig {
fn default() -> Self {
Self {
port: default_dev_port(),
host: default_dev_host(),
open_browser: true,
hot_reload: true,
agent_mode: true,
devtools: true,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum WindowKind {
#[serde(rename = "normal")]
Normal,
#[serde(rename = "overlay")]
Overlay,
#[serde(rename = "wallpaper")]
Wallpaper,
}
impl Default for WindowKind {
fn default() -> Self {
Self::Normal
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WindowIcon {
pub rgba: Vec<u8>,
pub width: u32,
pub height: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WindowConfig {
#[serde(default = "default_title")]
pub title: String,
#[serde(default = "default_width")]
pub width: u32,
#[serde(default = "default_height")]
pub height: u32,
#[serde(default = "default_true")]
pub resizable: bool,
#[serde(default = "default_true")]
pub decorations: bool,
#[serde(default)]
pub transparent: bool,
#[serde(default)]
pub always_on_top: bool,
#[serde(default = "default_true")]
pub visible_on_all_workspaces: bool,
#[serde(default)]
pub icon: Option<WindowIcon>,
#[serde(default)]
pub kind: WindowKind,
#[serde(default)]
pub click_through: bool,
pub min_size: Option<(u32, u32)>,
pub max_size: Option<(u32, u32)>,
}
impl Default for WindowConfig {
fn default() -> Self {
Self {
title: default_title(),
width: default_width(),
height: default_height(),
resizable: default_true(),
decorations: default_true(),
transparent: false,
always_on_top: false,
visible_on_all_workspaces: true,
icon: None,
kind: WindowKind::default(),
click_through: false,
min_size: None,
max_size: None,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BundleConfig {
#[serde(default = "default_windows_installer")]
pub windows_installer: String,
pub macos_bundle_id: Option<String>,
#[serde(default = "default_linux_packages")]
pub linux_packages: Vec<String>,
pub icon: Option<String>,
#[serde(default)]
pub macos_sign: bool,
#[serde(default = "default_true")]
pub macos_dmg: bool,
pub copyright: Option<String>,
}
impl Default for BundleConfig {
fn default() -> Self {
Self {
windows_installer: default_windows_installer(),
macos_bundle_id: None,
linux_packages: default_linux_packages(),
icon: None,
macos_sign: false,
macos_dmg: true,
copyright: None,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CommandConfig {
pub command: String,
pub working_dir: Option<String>,
#[serde(default)]
pub env: HashMap<String, String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HotkeyConfig {
#[serde(default)]
pub id: Option<String>,
pub combo: String,
#[serde(default)]
pub title: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GlobalInputConfig {
#[serde(default)]
pub enabled: bool,
#[serde(default = "default_true")]
pub keyboard: bool,
#[serde(default = "default_true")]
pub mouse: bool,
#[serde(default)]
pub mouse_move: bool,
}
impl Default for GlobalInputConfig {
fn default() -> Self {
Self {
enabled: false,
keyboard: true,
mouse: true,
mouse_move: false,
}
}
}
fn default_title() -> String {
"rdesktop App".to_string()
}
fn default_width() -> u32 {
1280
}
fn default_height() -> u32 {
720
}
fn default_true() -> bool {
true
}
fn default_dev_port() -> u16 {
1420
}
fn default_dev_host() -> String {
"localhost".to_string()
}
fn default_windows_installer() -> String {
"nsis".to_string()
}
fn default_linux_packages() -> Vec<String> {
vec!["appimage".to_string()]
}