use clap::ValueEnum;
use serde::{Deserialize, Serialize};
use std::path::PathBuf;
pub(super) use super::defaults::default_true;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct PlottingConfig {
#[serde(default)]
pub mode: PlotMode,
#[serde(default)]
pub force_headless: bool,
#[serde(default)]
pub backend: PlotBackend,
pub gui: Option<GuiConfig>,
pub export: Option<ExportConfig>,
#[serde(default)]
pub scatter_target_points: Option<u32>,
#[serde(default)]
pub surface_vertex_budget: Option<u64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct GuiConfig {
#[serde(default = "default_window_width")]
pub width: u32,
#[serde(default = "default_window_height")]
pub height: u32,
#[serde(default = "default_true")]
pub vsync: bool,
#[serde(default)]
pub maximized: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct ExportConfig {
#[serde(default)]
pub format: ExportFormat,
#[serde(default = "default_dpi")]
pub dpi: u32,
pub output_dir: Option<PathBuf>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, ValueEnum)]
#[serde(rename_all = "lowercase")]
pub enum PlotMode {
Auto,
Gui,
Headless,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, ValueEnum)]
#[serde(rename_all = "lowercase")]
pub enum PlotBackend {
Auto,
Wgpu,
Static,
Web,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum ExportFormat {
Png,
Svg,
Pdf,
Html,
}
impl Default for PlottingConfig {
fn default() -> Self {
Self {
mode: PlotMode::Auto,
force_headless: false,
backend: PlotBackend::Auto,
gui: Some(GuiConfig::default()),
export: Some(ExportConfig::default()),
scatter_target_points: None,
surface_vertex_budget: None,
}
}
}
impl Default for GuiConfig {
fn default() -> Self {
Self {
width: default_window_width(),
height: default_window_height(),
vsync: true,
maximized: false,
}
}
}
impl Default for ExportConfig {
fn default() -> Self {
Self {
format: ExportFormat::Png,
dpi: default_dpi(),
output_dir: None,
}
}
}
impl Default for PlotMode {
fn default() -> Self {
Self::Auto
}
}
impl Default for PlotBackend {
fn default() -> Self {
Self::Auto
}
}
impl Default for ExportFormat {
fn default() -> Self {
Self::Png
}
}
fn default_window_width() -> u32 {
1200
}
fn default_window_height() -> u32 {
800
}
fn default_dpi() -> u32 {
300
}