use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
pub enum PaperSize {
A4,
Letter,
Legal,
Custom { width: f64, height: f64 },
}
impl PaperSize {
pub fn dimensions(&self) -> (f64, f64) {
match self {
PaperSize::A4 => (8.27, 11.69),
PaperSize::Letter => (8.5, 11.0),
PaperSize::Legal => (8.5, 14.0),
PaperSize::Custom { width, height } => (*width, *height),
}
}
}
impl Default for PaperSize {
fn default() -> Self {
PaperSize::A4
}
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
pub struct PageMargins {
pub top: f64,
pub bottom: f64,
pub left: f64,
pub right: f64,
}
impl Default for PageMargins {
fn default() -> Self {
Self {
top: 0.75,
bottom: 0.75,
left: 0.75,
right: 0.75,
}
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct HeaderConfig {
pub custom_html: Option<String>,
pub left: Option<String>,
pub center: Option<String>,
pub right: Option<String>,
pub font_size: Option<String>,
pub color: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct FooterConfig {
pub custom_html: Option<String>,
pub left: Option<String>,
pub center: Option<String>,
pub right: Option<String>,
pub font_size: Option<String>,
pub color: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MarkdownOptions {
pub unsafe_html: bool,
pub tables: bool,
pub footnotes: bool,
pub description_lists: bool,
pub strikethrough: bool,
pub tasklist: bool,
pub autolink: bool,
pub superscript: bool,
}
impl Default for MarkdownOptions {
fn default() -> Self {
Self {
unsafe_html: true,
tables: true,
footnotes: true,
description_lists: true,
strikethrough: true,
tasklist: true,
autolink: true,
superscript: true,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PdfConfig {
pub title: String,
pub custom_css: Option<String>,
pub extra_css: Option<String>,
pub paper_size: PaperSize,
pub margins: PageMargins,
pub landscape: bool,
pub header: HeaderConfig,
pub footer: FooterConfig,
pub display_header_footer: bool,
pub print_background: bool,
pub markdown_options: MarkdownOptions,
pub heading_numbers: bool,
pub chrome_window_size: (u32, u32),
pub page_load_wait_secs: u64,
}
impl Default for PdfConfig {
fn default() -> Self {
Self {
title: String::new(),
custom_css: None,
extra_css: None,
paper_size: PaperSize::default(),
margins: PageMargins::default(),
landscape: false,
header: HeaderConfig::default(),
footer: FooterConfig::default(),
display_header_footer: false,
print_background: true,
markdown_options: MarkdownOptions::default(),
heading_numbers: false,
chrome_window_size: (1280, 900),
page_load_wait_secs: 5,
}
}
}