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
use serde::Serialize; use super::{GridSpan, TableCellBorders, TableCellWidth, VMerge}; use crate::documents::BuildXML; use crate::types::*; use crate::xml_builder::*; #[derive(Serialize, Debug, Clone, PartialEq)] #[serde(rename_all = "camelCase")] pub struct TableCellProperty { width: Option<TableCellWidth>, borders: Option<TableCellBorders>, grid_span: Option<GridSpan>, vertical_merge: Option<VMerge>, } impl TableCellProperty { pub fn new() -> TableCellProperty { Default::default() } pub fn width(mut self, v: usize, t: WidthType) -> TableCellProperty { self.width = Some(TableCellWidth::new(v, t)); self } pub fn vertical_merge(mut self, t: VMergeType) -> TableCellProperty { self.vertical_merge = Some(VMerge::new(t)); self } pub fn grid_span(mut self, v: usize) -> TableCellProperty { self.grid_span = Some(GridSpan::new(v)); self } } impl Default for TableCellProperty { fn default() -> Self { TableCellProperty { width: None, borders: None, grid_span: None, vertical_merge: None, } } } impl BuildXML for TableCellProperty { fn build(&self) -> Vec<u8> { XMLBuilder::new() .open_table_cell_property() .add_optional_child(&self.width) .add_optional_child(&self.borders) .add_optional_child(&self.grid_span) .add_optional_child(&self.vertical_merge) .close() .build() } } #[cfg(test)] mod tests { use super::*; #[cfg(test)] use pretty_assertions::assert_eq; use std::str; #[test] fn test_default() { let c = TableCellProperty::new(); let b = c.build(); assert_eq!(str::from_utf8(&b).unwrap(), r#"<w:tcPr />"#); } #[test] fn test_grid_span() { let c = TableCellProperty::new().grid_span(3); let b = c.build(); assert_eq!( str::from_utf8(&b).unwrap(), r#"<w:tcPr><w:gridSpan w:val="3" /></w:tcPr>"# ); } #[test] fn test_vmerge() { let c = TableCellProperty::new().vertical_merge(VMergeType::Continue); let b = c.build(); assert_eq!( str::from_utf8(&b).unwrap(), r#"<w:tcPr><w:vMerge w:val="continue" /></w:tcPr>"# ); } #[test] fn test_table_cell_prop_json() { let c = TableCellProperty::new() .vertical_merge(VMergeType::Continue) .grid_span(3) .width(200, WidthType::DXA); assert_eq!( serde_json::to_string(&c).unwrap(), r#"{"width":{"width":200,"widthType":"DXA"},"borders":null,"gridSpan":3,"verticalMerge":"continue"}"# ); } }