1#[macro_export]
2#[doc(hidden)]
3macro_rules! __define_struct_vec {
4 ( ($tag:expr, $name:ident, $choicename:ident) { $($value2:expr, $variant2:ident, $ty2: ty)* } { $($value:expr, $variant:ident)* }) => {
5 #[derive(Debug, XmlRead, XmlWrite, Clone)]
6 #[cfg_attr(test, derive(PartialEq))]
7 pub enum $choicename {
8 $(
9 #[xml(tag = $value)]
10 $variant($variant),
11 )*
12 }
13
14 #[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
15 #[cfg_attr(test, derive(PartialEq))]
16 #[xml(tag = $tag)]
17 pub struct $name {
18 $(
19 #[xml(attr = $value2)]
20 pub $variant2: Option<$ty2>,
21 )*
22
23 #[xml(
24 $(
25 child = $value,
26 )*
27 )]
28 pub content: Vec<$choicename>,
29 }
30
31 impl $name {
32 $(
33 #[inline(always)]
34 pub fn $variant2<T: Into<$ty2>>(mut self, value: T) -> Self {
35 self.$variant2 = Some(value.into());
36 self
37 }
38 )*
39 }
40 }
41}
42
43#[macro_export]
44#[doc(hidden)]
45macro_rules! __define_struct {
46 ( ($tag:expr, $name:ident, $a:lifetime) { $($value:expr, $variant:ident, $ty: ty)* }) => {
47 #[derive(Debug, XmlRead, XmlWrite, Clone, Default)]
48 #[cfg_attr(test, derive(PartialEq))]
49 #[xml(tag = $tag)]
50 pub struct $name<$a> {
51 $(
52 #[xml(attr = $value)]
53 pub $variant: Option<$ty>,
54 )*
55 }
56
57 impl<$a> $name<$a> {
58 $(
59 #[inline(always)]
60 pub fn $variant<T: Into<$ty>>(mut self, value: T) -> Self {
61 self.$variant = Some(value.into());
62 self
63 }
64 )*
65 }
66 };
67
68 ( ($tag:expr, $name:ident) { $($value:expr, $variant:ident, $ty: ty)* }) => {
69 #[derive(Debug, XmlRead, XmlWrite, Clone, Default)]
70 #[cfg_attr(test, derive(PartialEq))]
71 #[xml(tag = $tag)]
72 pub struct $name {
73 $(
74 #[xml(attr = $value)]
75 pub $variant: Option<$ty>,
76 )*
77 }
78
79 impl $name {
80 $(
81 #[inline(always)]
82 pub fn $variant<T: Into<$ty>>(mut self, value: T) -> Self {
83 self.$variant = Some(value.into());
84 self
85 }
86 )*
87 }
88 };
89
90 ( ($tag:expr, $name:ident) { $($value:expr, $variant:ident, $ty: ty)* } { $($value2:expr, $variant2:ident, $ty2: ty)* }) => {
91 #[derive(Debug, XmlRead, XmlWrite, Clone, Default)]
92 #[cfg_attr(test, derive(PartialEq))]
93 #[xml(tag = $tag)]
94 pub struct $name {
95 $(
96 #[xml(attr = $value)]
97 pub $variant: Option<$ty>,
98 )*
99 $(
100 #[xml(child = $value2)]
101 pub $variant2: Option<$ty2>,
102 )*
103 }
104
105 impl $name {
106 $(
107 #[inline(always)]
108 pub fn $variant<T: Into<$ty>>(mut self, value: T) -> Self {
109 self.$variant = Some(value.into());
110 self
111 }
112 )*
113
114 $(
115 #[inline(always)]
116 pub fn $variant2<T: Into<$ty2>>(mut self, value: T) -> Self {
117 self.$variant2 = Some(value.into());
118 self
119 }
120 )*
121 }
122 };
123}
124
125#[macro_export]
126#[doc(hidden)]
127macro_rules! __define_enum {
128 ($name:ident { $($variant:ident = $value:expr, )* }) => {
129 #[derive(Debug, Clone)]
130 #[cfg_attr(test, derive(PartialEq))]
131 pub enum $name {
132 $( $variant, )*
133 }
134
135 impl std::fmt::Display for $name {
136 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
137 match *self {
138 $( $name::$variant => write!(f, $value), )*
139 }
140 }
141 }
142
143 impl std::str::FromStr for $name {
144 type Err = String;
145
146 fn from_str(s: &str) -> Result<Self, Self::Err> {
147 match s {
148 $($value => Ok($name::$variant),)*
149 s => Err(format!(
150 "Unkown Value. Found `{}`, Expected `{}`",
151 s,
152 stringify!($($value,)*)
153 ))
154 }
155 }
156 }
157 }
158}
159
160#[macro_export]
161#[doc(hidden)]
162macro_rules! __string_enum {
163 ($name:ident { $($variant:ident = $value:expr, )* }) => {
164 impl std::fmt::Display for $name {
165 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
166 match *self {
167 $( $name::$variant => write!(f, $value), )*
168 }
169 }
170 }
171
172 impl std::str::FromStr for $name {
173 type Err = String;
174
175 fn from_str(s: &str) -> Result<Self, Self::Err> {
176 match s {
177 $($value => Ok($name::$variant),)*
178 s => Err(format!(
179 "Unkown Value. Found `{}`, Expected `{}`",
180 s,
181 stringify!($($value,)*)
182 ))
183 }
184 }
185 }
186 }
187}
188
189#[macro_export]
190#[doc(hidden)]
191macro_rules! __setter {
192 ($field:ident: Option<$ty:ty>) => {
193 #[inline(always)]
194 pub fn $field<T: Into<$ty>>(mut self, value: T) -> Self {
195 self.$field = Some(value.into());
196 self
197 }
198 };
199 ($field:ident: $ty:ty) => {
200 #[inline(always)]
201 pub fn $field<T: Into<$ty>>(mut self, value: T) -> Self {
202 self.$field = value.into();
203 self
204 }
205 };
206}
207
208#[macro_export]
209#[doc(hidden)]
210macro_rules! __xml_test_suites {
211 ($type:tt, $($struct:expr, $string:expr,)*) => {
212 #[test]
213 fn xml_test_suites() -> hard_xml::XmlResult<()> {
214 let _ = env_logger::builder()
215 .is_test(true)
216 .format_timestamp(None)
217 .try_init();
218
219 $(
220 assert_eq!($string, ($struct).to_string()?);
221 assert_eq!($struct, $type::from_str($string)?);
222 )*
223
224 Ok(())
225 }
226 };
227}