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
#![allow(unused_must_use)]
use derive_more::From;
use std::borrow::Cow;
use strong_xml::{XmlRead, XmlWrite};

use crate::{
    __setter, __xml_test_suites,
    __string_enum,
};

/// A set of elements that can be contained as the content of a run.
#[derive(Debug, From, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
pub enum HeaderFooterReference<'a> {
    #[xml(tag = "w:headerReference")]
    Header(HeaderReference<'a>),
    #[xml(tag = "w:footerReference")]
    Footer(FooterReference<'a>),
}

/// HeaderReference
///
#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:headerReference")]
pub struct HeaderReference<'a> {
    /// Specifies the HeaderReference type of this HeaderReference.
    #[xml(attr = "w:type")]
    pub ty: Option<HeaderFooterReferenceType>,
    #[xml(attr = "r:id")]
    pub id: Option<Cow<'a, str>>,
}

impl<'a> HeaderReference<'a> {
    __setter!(ty: Option<HeaderFooterReferenceType>);
    __setter!(id: Option<Cow<'a, str>>);
}


/// FooterReference
///
#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:footerReference")]
pub struct FooterReference<'a> {
    /// Specifies the FooterReference type of this FooterReference.
    #[xml(attr = "w:type")]
    pub ty: Option<HeaderFooterReferenceType>,
    #[xml(attr = "r:id")]
    pub id: Option<Cow<'a, str>>,
}

impl<'a> FooterReference<'a> {
    __setter!(ty: Option<HeaderFooterReferenceType>);
    __setter!(id: Option<Cow<'a, str>>);
}

#[derive(Debug, Clone)]
#[cfg_attr(test, derive(PartialEq))]
pub enum HeaderFooterReferenceType {
    Default,
    Even,
    First,
}

__string_enum! {
    HeaderFooterReferenceType {
        Default = "default",
        Even = "even",
        First = "first",
    }
}

__xml_test_suites!(
    HeaderReference,
    HeaderReference::default(),
    r#"<w:headerReference/>"#,
    HeaderReference::default().ty(HeaderFooterReferenceType::Default),
    r#"<w:headerReference w:type="default"/>"#,
);