docx_rs/documents/elements/
level_override.rs

1use super::*;
2use std::io::Write;
3
4use crate::documents::BuildXML;
5use crate::xml_builder::*;
6
7use serde::Serialize;
8
9/*
1017.9.8 lvlOverride (Numbering Level Definition Override)
11This element specifies an optional override which shall be applied in place of zero or more levels from the abstract numbering definition for a given numbering definition instance. Each instance of this element is used to override the appearance and behavior of a given numbering level definition within the given abstract numbering definition.
12*/
13#[derive(Debug, Clone, PartialEq, Serialize)]
14#[serde(rename_all = "camelCase")]
15pub struct LevelOverride {
16    pub level: usize,
17    pub override_start: Option<usize>,
18    pub override_level: Option<Level>,
19}
20
21impl LevelOverride {
22    pub fn new(level: usize) -> LevelOverride {
23        LevelOverride {
24            level,
25            override_start: None,
26            override_level: None,
27        }
28    }
29
30    pub fn start(mut self, start: usize) -> LevelOverride {
31        self.override_start = Some(start);
32        self
33    }
34
35    pub fn level(mut self, override_level: Level) -> LevelOverride {
36        self.override_level = Some(override_level);
37        self
38    }
39}
40
41impl BuildXML for LevelOverride {
42    fn build_to<W: Write>(
43        &self,
44        stream: xml::writer::EventWriter<W>,
45    ) -> xml::writer::Result<xml::writer::EventWriter<W>> {
46        XMLBuilder::from(stream)
47            .open_level_override(&format!("{}", self.level))?
48            .add_optional_child(&self.override_level)?
49            .apply_opt(self.override_start, |start, b| {
50                b.start_override(&format!("{}", start))
51            })?
52            .close()?
53            .into_inner()
54    }
55}
56
57#[cfg(test)]
58mod tests {
59
60    use super::*;
61    #[cfg(test)]
62    use pretty_assertions::assert_eq;
63    use std::str;
64
65    #[test]
66    fn test_level_override() {
67        let c = LevelOverride::new(1).start(2);
68        let b = c.build();
69        assert_eq!(
70            str::from_utf8(&b).unwrap(),
71            r#"<w:lvlOverride w:ilvl="1"><w:startOverride w:val="2" /></w:lvlOverride>"#
72        );
73    }
74
75    #[test]
76    fn test_override_with_lvl() {
77        let lvl = Level::new(
78            1,
79            Start::new(1),
80            NumberFormat::new("decimal"),
81            LevelText::new("%4."),
82            LevelJc::new("left"),
83        );
84        let c = LevelOverride::new(1).level(lvl);
85        let b = c.build();
86        assert_eq!(
87            str::from_utf8(&b).unwrap(),
88            r#"<w:lvlOverride w:ilvl="1"><w:lvl w:ilvl="1"><w:start w:val="1" /><w:numFmt w:val="decimal" /><w:lvlText w:val="%4." /><w:lvlJc w:val="left" /><w:pPr><w:rPr /></w:pPr><w:rPr /></w:lvl></w:lvlOverride>"#
89        );
90    }
91}