use std::path::PathBuf;
use easydoc_core::Result;
use easydoc_core::metadata::DocumentMeta;
use easydoc_core::types::HeadingLevel;
use crate::executor::write_executor::DocWriteExecutor;
use crate::{DocImage, Paragraph, Table};
pub struct DocBuilder {
path: PathBuf,
meta: DocumentMeta,
elements: Vec<DocumentElement>,
}
pub(crate) enum DocumentElement {
Heading { text: String, level: HeadingLevel },
Paragraph(Paragraph),
Table(Table),
Image(DocImage),
PageBreak,
}
impl DocBuilder {
#[must_use]
pub fn new(path: impl Into<PathBuf>) -> Self {
Self {
path: path.into(),
meta: DocumentMeta::default(),
elements: Vec::new(),
}
}
#[must_use]
pub fn title(mut self, title: impl Into<String>) -> Self {
self.meta = self.meta.title(title);
self
}
#[must_use]
pub fn author(mut self, author: impl Into<String>) -> Self {
self.meta = self.meta.author(author);
self
}
#[must_use]
pub fn add_heading(mut self, text: impl Into<String>, level: HeadingLevel) -> Self {
self.elements.push(DocumentElement::Heading {
text: text.into(),
level,
});
self
}
#[must_use]
pub fn add_paragraph(mut self, paragraph: Paragraph) -> Self {
self.elements.push(DocumentElement::Paragraph(paragraph));
self
}
#[must_use]
pub fn add_table(mut self, table: Table) -> Self {
self.elements.push(DocumentElement::Table(table));
self
}
#[must_use]
pub fn add_image(mut self, image: DocImage) -> Self {
self.elements.push(DocumentElement::Image(image));
self
}
#[must_use]
pub fn add_page_break(mut self) -> Self {
self.elements.push(DocumentElement::PageBreak);
self
}
pub fn build(self) -> Result<DocWriteExecutor> {
DocWriteExecutor::new(self.path, self.meta, self.elements)
}
pub fn save(self) -> Result<()> {
self.build()?.save()
}
pub fn save_to_writer<W: std::io::Write + std::io::Seek>(self, writer: W) -> Result<()> {
self.build()?.save_to_writer(writer)
}
pub fn save_to_bytes(self) -> Result<Vec<u8>> {
self.build()?.save_to_bytes()
}
}