diff --git a/parsers/src/data_forms.rs b/parsers/src/data_forms.rs index e1eb473..165d9b4 100644 --- a/parsers/src/data_forms.rs +++ b/parsers/src/data_forms.rs @@ -83,6 +83,9 @@ pub struct Field { /// The form will be rejected if this field isn’t present. pub required: bool, + /// The natural-language description of the field, intended for presentation in a user-agent + pub desc: Option, + /// A list of allowed values. pub options: Vec, @@ -101,6 +104,7 @@ impl Field { type_, label: None, required: false, + desc: None, options: Vec::new(), media: Vec::new(), values: Vec::new(), @@ -134,6 +138,7 @@ impl TryFrom for Field { type_: get_attr!(elem, "type", Default), label: get_attr!(elem, "label", Option), required: false, + desc: None, options: vec![], values: vec![], media: vec![], @@ -159,6 +164,10 @@ impl TryFrom for Field { } else if element.is("media", ns::MEDIA_ELEMENT) { let media_element = MediaElement::try_from(element.clone())?; field.media.push(media_element); + } else if element.is("desc", ns::DATA_FORMS) { + check_no_children!(element, "value"); + check_no_attributes!(element, "value"); + field.desc = Some(element.text()); } else { return Err(Error::ParseError( "Field child isn’t a value, option or media element.", @@ -332,7 +341,7 @@ mod tests { fn test_size() { assert_size!(Option_, 24); assert_size!(FieldType, 1); - assert_size!(Field, 64); + assert_size!(Field, 76); assert_size!(DataFormType, 1); assert_size!(DataForm, 52); } @@ -342,7 +351,7 @@ mod tests { fn test_size() { assert_size!(Option_, 48); assert_size!(FieldType, 1); - assert_size!(Field, 128); + assert_size!(Field, 152); assert_size!(DataFormType, 1); assert_size!(DataForm, 104); } @@ -356,6 +365,30 @@ mod tests { assert!(form.fields.is_empty()); } + #[test] + fn test_desc() { + let elem: Element = + "Tell all your friends about your new bot!" + .parse() + .unwrap(); + let form = DataForm::try_from(elem).unwrap(); + assert_eq!(form.type_, DataFormType::Form); + assert!(form.form_type.is_none()); + assert_eq!( + form.fields, + vec![Field { + var: "invitelist".to_string(), + type_: FieldType::JidMulti, + label: Some("People to invite".to_string()), + required: false, + desc: Some("Tell all your friends about your new bot!".to_string()), + options: vec![], + values: vec![], + media: vec![], + }] + ); + } + #[test] fn test_invalid() { let elem: Element = "".parse().unwrap(); diff --git a/parsers/src/pubsub/owner.rs b/parsers/src/pubsub/owner.rs index 6d94b2f..65c9a33 100644 --- a/parsers/src/pubsub/owner.rs +++ b/parsers/src/pubsub/owner.rs @@ -234,6 +234,7 @@ mod tests { type_: FieldType::ListSingle, label: None, required: false, + desc: None, options: vec![], values: vec![String::from("whitelist")], media: vec![], @@ -281,6 +282,7 @@ mod tests { type_: FieldType::ListSingle, label: None, required: false, + desc: None, options: vec![], values: vec![String::from("whitelist")], media: vec![], diff --git a/parsers/src/pubsub/pubsub.rs b/parsers/src/pubsub/pubsub.rs index 0fdf648..da32b6a 100644 --- a/parsers/src/pubsub/pubsub.rs +++ b/parsers/src/pubsub/pubsub.rs @@ -626,6 +626,7 @@ mod tests { type_: FieldType::ListSingle, label: None, required: false, + desc: None, options: vec![], values: vec![String::from("whitelist")], media: vec![], diff --git a/parsers/src/server_info.rs b/parsers/src/server_info.rs index 3ad9e00..8b37524 100644 --- a/parsers/src/server_info.rs +++ b/parsers/src/server_info.rs @@ -92,6 +92,7 @@ pub fn generate_address_field>(var: S, values: Vec) -> F type_: FieldType::ListMulti, label: None, required: false, + desc: None, options: vec![], values, media: vec![], @@ -128,6 +129,7 @@ mod tests { type_: FieldType::ListMulti, label: None, required: false, + desc: None, options: vec![], values: vec![], media: vec![], @@ -137,6 +139,7 @@ mod tests { type_: FieldType::ListMulti, label: None, required: false, + desc: None, options: vec![], values: vec![ String::from("xmpp:admin@foo.bar"), @@ -150,6 +153,7 @@ mod tests { type_: FieldType::ListMulti, label: None, required: false, + desc: None, options: vec![], values: vec![], media: vec![], @@ -159,6 +163,7 @@ mod tests { type_: FieldType::ListMulti, label: None, required: false, + desc: None, options: vec![], values: vec![], media: vec![], @@ -168,6 +173,7 @@ mod tests { type_: FieldType::ListMulti, label: None, required: false, + desc: None, options: vec![], values: vec![ String::from("xmpp:security@foo.bar"), @@ -180,6 +186,7 @@ mod tests { type_: FieldType::ListMulti, label: None, required: false, + desc: None, options: vec![], values: vec![String::from("mailto:support@foo.bar")], media: vec![],