use serde::{Deserialize, Serialize};
use std::path::PathBuf;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EngineConfig {
pub pack_paths: Vec<PathBuf>,
pub font_paths: Vec<PathBuf>,
pub use_embedded_fonts: bool,
pub use_system_fonts: bool,
pub cache_dir: Option<PathBuf>,
}
impl Default for EngineConfig {
fn default() -> Self {
Self {
pack_paths: std::iter::once(PathBuf::from("./packs"))
.chain(home_dir().map(|home| home.join(".renderreport/packs")))
.collect(),
font_paths: vec![],
use_embedded_fonts: true,
use_system_fonts: true,
cache_dir: None,
}
}
}
impl EngineConfig {
pub fn builder() -> EngineConfigBuilder {
EngineConfigBuilder::default()
}
pub fn add_pack_path(&mut self, path: impl Into<PathBuf>) {
self.pack_paths.push(path.into());
}
pub fn add_font_path(&mut self, path: impl Into<PathBuf>) {
self.font_paths.push(path.into());
}
}
#[derive(Default)]
pub struct EngineConfigBuilder {
config: EngineConfig,
}
impl EngineConfigBuilder {
pub fn pack_path(mut self, path: impl Into<PathBuf>) -> Self {
self.config.pack_paths.push(path.into());
self
}
pub fn font_path(mut self, path: impl Into<PathBuf>) -> Self {
self.config.font_paths.push(path.into());
self
}
pub fn use_embedded_fonts(mut self, value: bool) -> Self {
self.config.use_embedded_fonts = value;
self
}
pub fn use_system_fonts(mut self, value: bool) -> Self {
self.config.use_system_fonts = value;
self
}
pub fn cache_dir(mut self, path: impl Into<PathBuf>) -> Self {
self.config.cache_dir = Some(path.into());
self
}
pub fn build(self) -> EngineConfig {
self.config
}
}
fn home_dir() -> Option<PathBuf> {
std::env::var_os("HOME")
.or_else(|| std::env::var_os("USERPROFILE"))
.filter(|home| !home.is_empty())
.map(PathBuf::from)
}