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, 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: usize, special_indent: Option, end: Option, ) -> Self { self.paragraph_property = self.paragraph_property.indent(left, special_indent, end); self } pub fn paragraph_style(mut self, style_id: impl Into) -> Self { self.pstyle = Some(style_id.into()); self } } impl BuildXML for Level { fn build(&self) -> Vec { 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#""# ); } #[test] fn test_level_indent() { let b = Level::new( 1, Start::new(1), NumberFormat::new("decimal"), LevelText::new("%4."), LevelJc::new("left"), ) .indent(320, Some(SpecialIndentType::Hanging(200)), None) .build(); assert_eq!( str::from_utf8(&b).unwrap(), r#""# ); } }