easydoc_writer/
paragraph.rs1use easydoc_core::{HorizontalAlignment, ParagraphStyle};
6
7use crate::run::Run;
8
9#[derive(Clone)]
13pub struct Paragraph {
14 runs: Vec<Run>,
15 style: Option<ParagraphStyle>,
16}
17
18impl Paragraph {
19 #[must_use]
21 pub fn new() -> Self {
22 Self {
23 runs: Vec::new(),
24 style: None,
25 }
26 }
27
28 #[must_use]
30 pub fn add_text(mut self, text: impl Into<String>) -> Self {
31 self.runs.push(Run::text(text));
32 self
33 }
34
35 #[must_use]
37 pub fn add_run(mut self, run: Run) -> Self {
38 self.runs.push(run);
39 self
40 }
41
42 #[must_use]
44 pub fn alignment(mut self, alignment: HorizontalAlignment) -> Self {
45 self.style.get_or_insert_default().alignment = Some(alignment);
46 self
47 }
48
49 pub(crate) fn into_runs(self) -> Vec<Run> {
50 self.runs
51 }
52
53 pub(crate) fn paragraph_style(&self) -> Option<&ParagraphStyle> {
54 self.style.as_ref()
55 }
56}
57
58impl Default for Paragraph {
59 fn default() -> Self {
60 Self::new()
61 }
62}
63
64#[cfg(test)]
65mod tests {
66 use super::*;
67
68 #[test]
69 fn paragraph_new_is_empty() {
70 let p = Paragraph::new();
71 assert!(p.runs.is_empty());
72 assert!(p.style.is_none());
73 }
74
75 #[test]
76 fn paragraph_add_text() {
77 let p = Paragraph::new().add_text("hello");
78 assert_eq!(p.runs.len(), 1);
79 assert_eq!(p.runs[0].run_text(), "hello");
80 }
81
82 #[test]
83 fn paragraph_add_run() {
84 let run = Run::new("bold").bold();
85 let p = Paragraph::new().add_run(run);
86 assert_eq!(p.runs.len(), 1);
87 assert!(p.runs[0].font_config().unwrap().bold);
88 }
89
90 #[test]
91 fn paragraph_alignment() {
92 let p = Paragraph::new().alignment(HorizontalAlignment::Center);
93 assert!(p.paragraph_style().is_some());
94 assert_eq!(
95 p.paragraph_style().unwrap().alignment,
96 Some(HorizontalAlignment::Center)
97 );
98 }
99}