docx_rust/formatting/
spacing.rs

1#![allow(dead_code)]
2
3use hard_xml::{XmlRead, XmlWrite};
4
5use crate::{__setter, __xml_test_suites};
6
7use super::line_rule::LineRule;
8
9/// Spacing
10/// 100 percent.
11/// line is 240-based.
12///
13/// ```rust
14/// use docx_rust::formatting::*;
15///
16/// let sz = Size::from(42isize);
17/// ```
18#[derive(Debug, XmlRead, XmlWrite, Clone, Default)]
19#[cfg_attr(test, derive(PartialEq))]
20#[xml(tag = "w:spacing")]
21pub struct Spacing {
22    /// Spacing Above Paragraph In Line Units
23    #[xml(attr = "w:beforeLines")]
24    pub before_lines: Option<isize>,
25    /// Spacing Above Paragraph
26    #[xml(attr = "w:before")]
27    pub before: Option<isize>,
28    /// Automatically Determine Spacing Above Paragraph
29    #[xml(attr = "w:beforeAutospacing")]
30    pub before_auto_spacing: Option<bool>,
31    #[xml(attr = "w:afterLines")]
32    pub after_lines: Option<isize>,
33    #[xml(attr = "w:after")]
34    pub after: Option<isize>,
35    #[xml(attr = "w:afterAutospacing")]
36    pub after_auto_spacing: Option<bool>,
37    #[xml(attr = "w:line")]
38    pub line: Option<isize>,
39    #[xml(attr = "w:lineRule")]
40    pub line_rule: Option<LineRule>,
41}
42
43impl Spacing {
44    fn before<T>(mut self, val: T) -> Self
45    where
46        isize: From<T>,
47    {
48        self.before = Some(val.into());
49        self.before_lines = self.before;
50        self
51    }
52    fn after<T>(mut self, val: T) -> Self
53    where
54        isize: From<T>,
55    {
56        self.after = Some(val.into());
57        self.after_lines = self.before;
58        self
59    }
60
61    __setter!(line: Option<isize>);
62    __setter!(line_rule: Option<LineRule>);
63}
64
65__xml_test_suites!(
66    Spacing,
67    Spacing::default()
68        .before(50isize)
69        .after(50isize)
70        .line(384isize)
71        .line_rule(LineRule::Auto),
72    r#"<w:spacing w:beforeLines="50" w:before="50" w:afterLines="50" w:after="50" w:line="384" w:lineRule="auto"/>"#,
73);