1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
use crate::documents::{BuildXML, LevelJc, LevelText, NumberFormat, ParagraphProperty, Start}; use crate::types::*; use crate::xml_builder::*; use serde::Serialize; #[derive(Debug, Clone, PartialEq, Serialize)] #[serde(rename_all = "camelCase")] pub struct Level { pub level: usize, pub start: Start, pub format: NumberFormat, pub text: LevelText, pub jc: LevelJc, pub pstyle: Option<String>, pub paragraph_property: ParagraphProperty, } impl Level { pub fn new( level: usize, start: Start, format: NumberFormat, text: LevelText, jc: LevelJc, ) -> Level { Self { level, start, format, text, jc, pstyle: None, paragraph_property: ParagraphProperty::new(), } } pub fn indent( mut self, left: Option<i32>, special_indent: Option<SpecialIndentType>, end: Option<i32>, start_chars: Option<i32>, ) -> Self { self.paragraph_property = self.paragraph_property .indent(left, special_indent, end, start_chars); self } pub fn paragraph_style(mut self, style_id: impl Into<String>) -> Self { self.pstyle = Some(style_id.into()); self } } impl BuildXML for Level { fn build(&self) -> Vec<u8> { XMLBuilder::new() .open_level(&format!("{}", self.level)) .add_child(&self.start) .add_child(&self.format) .add_child(&self.text) .add_child(&self.jc) .add_child(&self.paragraph_property) .close() .build() } } #[cfg(test)] mod tests { use super::*; #[cfg(test)] use pretty_assertions::assert_eq; use std::str; #[test] fn test_level() { let b = Level::new( 1, Start::new(1), NumberFormat::new("decimal"), LevelText::new("%4."), LevelJc::new("left"), ) .build(); assert_eq!( str::from_utf8(&b).unwrap(), r#"<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:pStyle w:val="Normal" /><w:rPr /></w:pPr></w:lvl>"# ); } #[test] fn test_level_indent() { let b = Level::new( 1, Start::new(1), NumberFormat::new("decimal"), LevelText::new("%4."), LevelJc::new("left"), ) .indent(Some(320), Some(SpecialIndentType::Hanging(200)), None, None) .build(); assert_eq!( str::from_utf8(&b).unwrap(), r#"<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:pStyle w:val="Normal" /><w:rPr /><w:ind w:left="320" w:right="0" w:hanging="200" /></w:pPr></w:lvl>"# ); } }