use crate::documents::{BuildXML, Level}; use crate::xml_builder::*; #[derive(Debug, Clone)] pub struct Numbering<'a> { id: usize, levels: Vec>, } impl<'a> Numbering<'a> { pub fn new(id: usize) -> Self { Self { id, levels: vec![] } } pub fn add_level(mut self, level: Level<'a>) -> Self { self.levels.push(level); self } } impl<'a> BuildXML for Numbering<'a> { fn build(&self) -> Vec { let id = format!("{}", self.id); let mut b = XMLBuilder::new(); b = b.open_abstract_num(&id); for l in &self.levels { b = b.add_child(l); } b.close().open_num(&id).abstract_num_id(&id).close().build() } } #[cfg(test)] mod tests { use super::*; #[cfg(test)] use crate::documents::{Level, LevelJc, LevelText, NumberFormat, Start}; use pretty_assertions::assert_eq; use std::str; #[test] fn test_numbering() { let mut c = Numbering::new(0); c = c.add_level(Level::new( 1, Start::new(1), NumberFormat::new("decimal"), LevelText::new("%4."), LevelJc::new("left"), )); let b = c.build(); assert_eq!( str::from_utf8(&b).unwrap(), r#" "# ); } }