use std::borrow::Cow;
use strong_xml::{XmlRead, XmlWrite};
use crate::{
__setter, __xml_test_suites,
formatting::{Bold, Color, Dstrike, Italics, Outline, Size, Strike, Underline},
};
#[derive(Debug, Default, XmlRead, XmlWrite)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:rPr")]
pub struct CharacterProperty<'a> {
#[xml(child = "w:rStyle")]
pub style_id: Option<CharacterStyleId<'a>>,
#[xml(child = "w:color")]
pub color: Option<Color<'a>>,
#[xml(child = "w:sz")]
pub size: Option<Size>,
#[xml(child = "w:b")]
pub bold: Option<Bold>,
#[xml(child = "w:i")]
pub italics: Option<Italics>,
#[xml(child = "w:strike")]
pub strike: Option<Strike>,
#[xml(child = "w:dstrike")]
pub dstrike: Option<Dstrike>,
#[xml(child = "w:outline")]
pub outline: Option<Outline>,
#[xml(child = "w:u")]
pub underline: Option<Underline<'a>>,
}
impl<'a> CharacterProperty<'a> {
__setter!(style_id: Option<CharacterStyleId<'a>>);
__setter!(color: Option<Color<'a>>);
__setter!(bold: Option<Bold>);
__setter!(dstrike: Option<Dstrike>);
__setter!(italics: Option<Italics>);
__setter!(outline: Option<Outline>);
__setter!(strike: Option<Strike>);
__setter!(size: Option<Size>);
__setter!(underline: Option<Underline<'a>>);
}
#[derive(Debug, XmlRead, XmlWrite)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:rStyle")]
pub struct CharacterStyleId<'a> {
#[xml(attr = "w:val")]
pub value: Cow<'a, str>,
}
impl<'a, T: Into<Cow<'a, str>>> From<T> for CharacterStyleId<'a> {
fn from(val: T) -> Self {
CharacterStyleId { value: val.into() }
}
}
__xml_test_suites!(
CharacterProperty,
CharacterProperty::default(),
r#"<w:rPr/>"#,
CharacterProperty::default().style_id("id"),
r#"<w:rPr><w:rStyle w:val="id"/></w:rPr>"#,
CharacterProperty::default().color("00ff00"),
r#"<w:rPr><w:color w:val="00ff00"/></w:rPr>"#,
CharacterProperty::default().size(42usize),
r#"<w:rPr><w:sz w:val="42"/></w:rPr>"#,
CharacterProperty::default().bold(true),
r#"<w:rPr><w:b w:val="true"/></w:rPr>"#,
CharacterProperty::default().italics(false),
r#"<w:rPr><w:i w:val="false"/></w:rPr>"#,
CharacterProperty::default().outline(true),
r#"<w:rPr><w:outline w:val="true"/></w:rPr>"#,
CharacterProperty::default().strike(false),
r#"<w:rPr><w:strike w:val="false"/></w:rPr>"#,
CharacterProperty::default().dstrike(true),
r#"<w:rPr><w:dstrike w:val="true"/></w:rPr>"#,
CharacterProperty::default().underline(Underline::default()),
r#"<w:rPr><w:u/></w:rPr>"#,
);