data_forms, media_element: Implement forgotten serialisation.
This commit is contained in:
parent
b4e47e9a78
commit
f08c81382c
2 changed files with 118 additions and 2 deletions
|
@ -7,7 +7,7 @@
|
||||||
use std::convert::TryFrom;
|
use std::convert::TryFrom;
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
|
|
||||||
use minidom::Element;
|
use minidom::{Element, IntoElements, IntoAttributeValue, ElementEmitter};
|
||||||
|
|
||||||
use error::Error;
|
use error::Error;
|
||||||
use ns;
|
use ns;
|
||||||
|
@ -55,12 +55,48 @@ impl FromStr for FieldType {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl IntoAttributeValue for FieldType {
|
||||||
|
fn into_attribute_value(self) -> Option<String> {
|
||||||
|
Some(String::from(match self {
|
||||||
|
FieldType::Boolean => "boolean",
|
||||||
|
FieldType::Fixed => "fixed",
|
||||||
|
FieldType::Hidden => "hidden",
|
||||||
|
FieldType::JidMulti => "jid-multi",
|
||||||
|
FieldType::JidSingle => "jid-single",
|
||||||
|
FieldType::ListMulti => "list-multi",
|
||||||
|
FieldType::ListSingle => "list-single",
|
||||||
|
FieldType::TextMulti => "text-multi",
|
||||||
|
FieldType::TextPrivate => "text-private",
|
||||||
|
FieldType::TextSingle => "text-single",
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct Option_ {
|
pub struct Option_ {
|
||||||
pub label: Option<String>,
|
pub label: Option<String>,
|
||||||
pub value: String,
|
pub value: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<Option_> for Element {
|
||||||
|
fn from(option: Option_) -> Element {
|
||||||
|
Element::builder("option")
|
||||||
|
.ns(ns::DATA_FORMS)
|
||||||
|
.attr("label", option.label)
|
||||||
|
.append(Element::builder("value")
|
||||||
|
.ns(ns::DATA_FORMS)
|
||||||
|
.append(option.value)
|
||||||
|
.build())
|
||||||
|
.build()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl IntoElements for Option_ {
|
||||||
|
fn into_elements(self, emitter: &mut ElementEmitter) {
|
||||||
|
emitter.append_child(self.into());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct Field {
|
pub struct Field {
|
||||||
pub var: String,
|
pub var: String,
|
||||||
|
@ -72,6 +108,29 @@ pub struct Field {
|
||||||
pub media: Vec<MediaElement>,
|
pub media: Vec<MediaElement>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<Field> for Element {
|
||||||
|
fn from(field: Field) -> Element {
|
||||||
|
Element::builder("field")
|
||||||
|
.ns(ns::DATA_FORMS)
|
||||||
|
.attr("var", field.var)
|
||||||
|
.attr("type", field.type_)
|
||||||
|
.attr("label", field.label)
|
||||||
|
.append(if field.required { Some(Element::builder("required").ns(ns::DATA_FORMS).build()) } else { None })
|
||||||
|
.append(field.options)
|
||||||
|
.append(field.values.iter().map(|value| {
|
||||||
|
Element::builder("value").ns(ns::DATA_FORMS).append(value).build()
|
||||||
|
}).collect::<Vec<_>>())
|
||||||
|
.append(field.media)
|
||||||
|
.build()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl IntoElements for Field {
|
||||||
|
fn into_elements(self, emitter: &mut ElementEmitter) {
|
||||||
|
emitter.append_child(self.into());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq)]
|
#[derive(Debug, Clone, PartialEq)]
|
||||||
pub enum DataFormType {
|
pub enum DataFormType {
|
||||||
Cancel,
|
Cancel,
|
||||||
|
@ -95,6 +154,17 @@ impl FromStr for DataFormType {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl IntoAttributeValue for DataFormType {
|
||||||
|
fn into_attribute_value(self) -> Option<String> {
|
||||||
|
Some(String::from(match self {
|
||||||
|
DataFormType::Cancel => "cancel",
|
||||||
|
DataFormType::Form => "form",
|
||||||
|
DataFormType::Result_ => "result",
|
||||||
|
DataFormType::Submit => "submit",
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct DataForm {
|
pub struct DataForm {
|
||||||
pub type_: DataFormType,
|
pub type_: DataFormType,
|
||||||
|
@ -226,6 +296,19 @@ impl TryFrom<Element> for DataForm {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<DataForm> for Element {
|
||||||
|
fn from(form: DataForm) -> Element {
|
||||||
|
Element::builder("x")
|
||||||
|
.ns(ns::DATA_FORMS)
|
||||||
|
.attr("type", form.type_)
|
||||||
|
.append(form.form_type)
|
||||||
|
.append(form.title)
|
||||||
|
.append(form.instructions)
|
||||||
|
.append(form.fields)
|
||||||
|
.build()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
use std::convert::TryFrom;
|
use std::convert::TryFrom;
|
||||||
|
|
||||||
use minidom::Element;
|
use minidom::{Element, IntoElements, ElementEmitter};
|
||||||
|
|
||||||
use error::Error;
|
use error::Error;
|
||||||
|
|
||||||
|
@ -18,6 +18,22 @@ pub struct URI {
|
||||||
pub uri: String,
|
pub uri: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<URI> for Element {
|
||||||
|
fn from(uri: URI) -> Element {
|
||||||
|
Element::builder("uri")
|
||||||
|
.ns(ns::MEDIA_ELEMENT)
|
||||||
|
.attr("type", uri.type_)
|
||||||
|
.append(uri.uri)
|
||||||
|
.build()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl IntoElements for URI {
|
||||||
|
fn into_elements(self, emitter: &mut ElementEmitter) {
|
||||||
|
emitter.append_child(self.into());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct MediaElement {
|
pub struct MediaElement {
|
||||||
pub width: Option<usize>,
|
pub width: Option<usize>,
|
||||||
|
@ -54,6 +70,23 @@ impl TryFrom<Element> for MediaElement {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<MediaElement> for Element {
|
||||||
|
fn from(media: MediaElement) -> Element {
|
||||||
|
Element::builder("media")
|
||||||
|
.ns(ns::MEDIA_ELEMENT)
|
||||||
|
.attr("width", media.width)
|
||||||
|
.attr("height", media.height)
|
||||||
|
.append(media.uris)
|
||||||
|
.build()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl IntoElements for MediaElement {
|
||||||
|
fn into_elements(self, emitter: &mut ElementEmitter) {
|
||||||
|
emitter.append_child(self.into());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
Loading…
Reference in a new issue