easydoc_writer/builder/
doc_builder.rs1use std::path::PathBuf;
6
7use easydoc_core::Result;
8use easydoc_core::metadata::DocumentMeta;
9use easydoc_core::types::HeadingLevel;
10
11use crate::executor::write_executor::DocWriteExecutor;
12use crate::{DocImage, Paragraph, Table};
13
14pub struct DocBuilder {
32 path: PathBuf,
33 meta: DocumentMeta,
34 elements: Vec<DocumentElement>,
35}
36
37pub(crate) enum DocumentElement {
39 Heading { text: String, level: HeadingLevel },
40 Paragraph(Paragraph),
41 Table(Table),
42 Image(DocImage),
43 PageBreak,
44}
45
46impl DocBuilder {
47 #[must_use]
49 pub fn new(path: impl Into<PathBuf>) -> Self {
50 Self {
51 path: path.into(),
52 meta: DocumentMeta::default(),
53 elements: Vec::new(),
54 }
55 }
56
57 #[must_use]
59 pub fn title(mut self, title: impl Into<String>) -> Self {
60 self.meta = self.meta.title(title);
61 self
62 }
63
64 #[must_use]
66 pub fn author(mut self, author: impl Into<String>) -> Self {
67 self.meta = self.meta.author(author);
68 self
69 }
70
71 #[must_use]
73 pub fn add_heading(mut self, text: impl Into<String>, level: HeadingLevel) -> Self {
74 self.elements.push(DocumentElement::Heading {
75 text: text.into(),
76 level,
77 });
78 self
79 }
80
81 #[must_use]
83 pub fn add_paragraph(mut self, paragraph: Paragraph) -> Self {
84 self.elements.push(DocumentElement::Paragraph(paragraph));
85 self
86 }
87
88 #[must_use]
90 pub fn add_table(mut self, table: Table) -> Self {
91 self.elements.push(DocumentElement::Table(table));
92 self
93 }
94
95 #[must_use]
97 pub fn add_image(mut self, image: DocImage) -> Self {
98 self.elements.push(DocumentElement::Image(image));
99 self
100 }
101
102 #[must_use]
104 pub fn add_page_break(mut self) -> Self {
105 self.elements.push(DocumentElement::PageBreak);
106 self
107 }
108
109 pub fn build(self) -> Result<DocWriteExecutor> {
115 DocWriteExecutor::new(self.path, self.meta, self.elements)
116 }
117
118 pub fn save(self) -> Result<()> {
124 self.build()?.save()
125 }
126
127 pub fn save_to_writer<W: std::io::Write + std::io::Seek>(self, writer: W) -> Result<()> {
136 self.build()?.save_to_writer(writer)
137 }
138
139 pub fn save_to_bytes(self) -> Result<Vec<u8>> {
147 self.build()?.save_to_bytes()
148 }
149}