macros: Merge all element children into a common syntax.
This commit is contained in:
parent
cbef3f6e8d
commit
a625b88fce
8 changed files with 200 additions and 490 deletions
|
|
@ -4,84 +4,25 @@
|
|||
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
use try_from::TryFrom;
|
||||
use minidom::Element;
|
||||
use error::Error;
|
||||
use ns;
|
||||
use iq::{IqGetPayload, IqResultPayload};
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct Version {
|
||||
pub name: String,
|
||||
pub version: String,
|
||||
pub os: Option<String>,
|
||||
}
|
||||
generate_element_with_children!(
|
||||
Version, "query", VERSION,
|
||||
children: [
|
||||
name: Required<String> = ("name", VERSION) => String,
|
||||
version: Required<String> = ("version", VERSION) => String,
|
||||
os: Option<String> = ("os", VERSION) => String
|
||||
]
|
||||
);
|
||||
|
||||
impl IqGetPayload for Version {}
|
||||
impl IqResultPayload for Version {}
|
||||
|
||||
impl TryFrom<Element> for Version {
|
||||
type Err = Error;
|
||||
|
||||
fn try_from(elem: Element) -> Result<Version, Error> {
|
||||
check_self!(elem, "query", VERSION, "version");
|
||||
check_no_attributes!(elem, "version");
|
||||
let mut name = None;
|
||||
let mut version = None;
|
||||
let mut os = None;
|
||||
for child in elem.children() {
|
||||
if child.is("name", ns::VERSION) {
|
||||
if name.is_some() {
|
||||
return Err(Error::ParseError("More than one name in version element."));
|
||||
}
|
||||
name = Some(child.text());
|
||||
} else if child.is("version", ns::VERSION) {
|
||||
if version.is_some() {
|
||||
return Err(Error::ParseError("More than one version in version element."));
|
||||
}
|
||||
version = Some(child.text());
|
||||
} else if child.is("os", ns::VERSION) {
|
||||
if os.is_some() {
|
||||
return Err(Error::ParseError("More than one os in version element."));
|
||||
}
|
||||
os = Some(child.text());
|
||||
} else {
|
||||
return Err(Error::ParseError("Unknown child in version element."));
|
||||
}
|
||||
}
|
||||
let name = name.unwrap();
|
||||
let version = version.unwrap();
|
||||
Ok(Version {
|
||||
name,
|
||||
version,
|
||||
os,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl From<Version> for Element {
|
||||
fn from(version: Version) -> Element {
|
||||
Element::builder("query")
|
||||
.ns(ns::VERSION)
|
||||
.append(Element::builder("name")
|
||||
.ns(ns::VERSION)
|
||||
.append(version.name)
|
||||
.build())
|
||||
.append(Element::builder("version")
|
||||
.ns(ns::VERSION)
|
||||
.append(version.version)
|
||||
.build())
|
||||
.append(Element::builder("os")
|
||||
.ns(ns::VERSION)
|
||||
.append(version.os)
|
||||
.build())
|
||||
.build()
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use try_from::TryFrom;
|
||||
use minidom::Element;
|
||||
use compare_elements::NamespaceAwareCompare;
|
||||
|
||||
#[test]
|
||||
|
|
|
|||
Loading…
Reference in a new issue