docx_rs/documents/elements/
numbering.rs1use crate::documents::BuildXML;
2use crate::xml_builder::*;
3use std::io::Write;
4
5use super::*;
6use serde::Serialize;
7
8#[derive(Debug, Clone, PartialEq, Serialize)]
9#[serde(rename_all = "camelCase")]
10pub struct Numbering {
11 pub id: usize,
12 pub abstract_num_id: usize,
13 pub level_overrides: Vec<LevelOverride>,
14}
15
16impl Numbering {
17 pub fn new(id: usize, abstract_num_id: usize) -> Self {
18 Self {
19 id,
20 abstract_num_id,
21 level_overrides: vec![],
22 }
23 }
24
25 pub fn overrides(mut self, overrides: Vec<LevelOverride>) -> Self {
26 self.level_overrides = overrides;
27 self
28 }
29
30 pub fn add_override(mut self, o: LevelOverride) -> Self {
31 self.level_overrides.push(o);
32 self
33 }
34}
35
36impl BuildXML for Numbering {
37 fn build_to<W: Write>(
38 &self,
39 stream: xml::writer::EventWriter<W>,
40 ) -> xml::writer::Result<xml::writer::EventWriter<W>> {
41 let id = format!("{}", self.id);
42 let abs_id = format!("{}", self.abstract_num_id);
43 XMLBuilder::from(stream)
44 .open_num(&id)?
45 .abstract_num_id(&abs_id)?
46 .add_children(&self.level_overrides)?
47 .close()?
48 .into_inner()
49 }
50}
51
52#[cfg(test)]
53mod tests {
54
55 use super::*;
56 #[cfg(test)]
57 use pretty_assertions::assert_eq;
58 use std::str;
59
60 #[test]
61 fn test_numbering() {
62 let c = Numbering::new(0, 2);
63 let b = c.build();
64 assert_eq!(
65 str::from_utf8(&b).unwrap(),
66 r#"<w:num w:numId="0"><w:abstractNumId w:val="2" /></w:num>"#
67 );
68 }
69 #[test]
70 fn test_numbering_override() {
71 let c = Numbering::new(0, 2);
72 let overrides = vec![
73 LevelOverride::new(0).start(1),
74 LevelOverride::new(1).start(1),
75 ];
76 let b = c.overrides(overrides).build();
77 assert_eq!(
78 str::from_utf8(&b).unwrap(),
79 r#"<w:num w:numId="0"><w:abstractNumId w:val="2" /><w:lvlOverride w:ilvl="0"><w:startOverride w:val="1" /></w:lvlOverride><w:lvlOverride w:ilvl="1"><w:startOverride w:val="1" /></w:lvlOverride></w:num>"#
80 );
81 }
82
83 #[test]
84 fn test_numbering_override_json() {
85 let c = Numbering::new(0, 2);
86 let overrides = vec![
87 LevelOverride::new(0).start(1),
88 LevelOverride::new(1).start(1),
89 ];
90 assert_eq!(
91 serde_json::to_string(&c.overrides(overrides)).unwrap(),
92 r#"{"id":0,"abstractNumId":2,"levelOverrides":[{"level":0,"overrideStart":1,"overrideLevel":null},{"level":1,"overrideStart":1,"overrideLevel":null}]}"#
93 );
94 }
95}