use std::{hash::Hash, path::PathBuf};
use serde::{Deserialize, Serialize};
use super::{Id, Pages, PathPattern, PdfStandard, Scalar, TaskWhen};
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case", tag = "type")]
pub struct ApplyProjectTask {
pub id: Id,
pub document: Id,
#[serde(flatten)]
pub task: ProjectTask,
}
impl ApplyProjectTask {
pub fn doc_id(&self) -> &Id {
&self.document
}
pub fn id(&self) -> &Id {
&self.id
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case", tag = "type")]
pub enum ProjectTask {
Preview(PreviewTask),
ExportPdf(ExportPdfTask),
ExportPng(ExportPngTask),
ExportSvg(ExportSvgTask),
ExportHtml(ExportHtmlTask),
ExportSvgHtml(ExportHtmlTask),
ExportMd(ExportMarkdownTask),
ExportTeX(ExportTeXTask),
ExportText(ExportTextTask),
Query(QueryTask),
}
impl ProjectTask {
pub fn when(&self) -> Option<&TaskWhen> {
Some(match self {
Self::Preview(task) => &task.when,
Self::ExportPdf(..)
| Self::ExportPng(..)
| Self::ExportSvg(..)
| Self::ExportHtml(..)
| Self::ExportSvgHtml(..)
| Self::ExportMd(..)
| Self::ExportTeX(..)
| Self::ExportText(..)
| Self::Query(..) => &self.as_export()?.when,
})
}
pub fn as_export(&self) -> Option<&ExportTask> {
Some(match self {
Self::Preview(..) => return None,
Self::ExportPdf(task) => &task.export,
Self::ExportPng(task) => &task.export,
Self::ExportSvg(task) => &task.export,
Self::ExportHtml(task) => &task.export,
Self::ExportSvgHtml(task) => &task.export,
Self::ExportTeX(task) => &task.export,
Self::ExportMd(task) => &task.export,
Self::ExportText(task) => &task.export,
Self::Query(task) => &task.export,
})
}
pub fn as_export_mut(&mut self) -> Option<&mut ExportTask> {
Some(match self {
Self::Preview(..) => return None,
Self::ExportPdf(task) => &mut task.export,
Self::ExportPng(task) => &mut task.export,
Self::ExportSvg(task) => &mut task.export,
Self::ExportHtml(task) => &mut task.export,
Self::ExportSvgHtml(task) => &mut task.export,
Self::ExportTeX(task) => &mut task.export,
Self::ExportMd(task) => &mut task.export,
Self::ExportText(task) => &mut task.export,
Self::Query(task) => &mut task.export,
})
}
pub fn extension(&self) -> &str {
match self {
Self::ExportPdf { .. } => "pdf",
Self::Preview(..) | Self::ExportSvgHtml { .. } | Self::ExportHtml { .. } => "html",
Self::ExportMd { .. } => "md",
Self::ExportTeX { .. } => "tex",
Self::ExportText { .. } => "txt",
Self::ExportSvg { .. } => "svg",
Self::ExportPng { .. } => "png",
Self::Query(QueryTask {
format,
output_extension,
..
}) => output_extension.as_deref().unwrap_or(format),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub struct PreviewTask {
pub when: TaskWhen,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub struct ExportTask {
pub when: TaskWhen,
pub output: Option<PathPattern>,
#[serde(skip_serializing_if = "Vec::is_empty", default)]
pub transform: Vec<ExportTransform>,
}
impl ExportTask {
pub fn new(when: TaskWhen) -> Self {
Self {
when,
output: None,
transform: Vec::new(),
}
}
pub fn apply_pretty(&mut self) {
self.transform
.push(ExportTransform::Pretty { script: None });
}
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(default)]
pub struct PageMerge {
pub gap: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum ExportTransform {
Pages {
ranges: Vec<Pages>,
},
Merge {
gap: Option<String>,
},
Script {
#[serde(skip_serializing_if = "Option::is_none", default)]
script: Option<String>,
},
Pretty {
#[serde(skip_serializing_if = "Option::is_none", default)]
script: Option<String>,
},
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub struct ExportPdfTask {
#[serde(flatten)]
pub export: ExportTask,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub pages: Option<Vec<Pages>>,
#[serde(skip_serializing_if = "Vec::is_empty", default)]
pub pdf_standards: Vec<PdfStandard>,
#[serde(skip_serializing_if = "std::ops::Not::not", default)]
pub no_pdf_tags: bool,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub creation_timestamp: Option<i64>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub struct ExportPngTask {
#[serde(flatten)]
pub export: ExportTask,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub pages: Option<Vec<Pages>>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub page_number_template: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub merge: Option<PageMerge>,
pub ppi: Scalar,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub fill: Option<String>,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub struct ExportSvgTask {
#[serde(flatten)]
pub export: ExportTask,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub page_number_template: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub pages: Option<Vec<Pages>>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub merge: Option<PageMerge>,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub struct ExportHtmlTask {
#[serde(flatten)]
pub export: ExportTask,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub struct ExportMarkdownTask {
pub processor: Option<String>,
pub assets_path: Option<PathBuf>,
#[serde(flatten)]
pub export: ExportTask,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub struct ExportTeXTask {
pub processor: Option<String>,
pub assets_path: Option<PathBuf>,
#[serde(flatten)]
pub export: ExportTask,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub struct ExportTextTask {
#[serde(flatten)]
pub export: ExportTask,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub struct QueryTask {
#[serde(flatten)]
pub export: ExportTask,
pub format: String,
pub output_extension: Option<String>,
pub selector: String,
pub field: Option<String>,
pub one: bool,
}