mirror of
https://gitlab.com/xmpp-rs/xmpp-rs.git
synced 2024-06-18 05:35:57 +02:00
feat(xmpp-parsers): Support desc element in field
This commit is contained in:
parent
edf4347a5a
commit
17570b6868
|
@ -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<String>,
|
||||
|
||||
/// A list of allowed values.
|
||||
pub options: Vec<Option_>,
|
||||
|
||||
|
@ -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<Element> 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<Element> 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 =
|
||||
"<x xmlns='jabber:x:data' type='form'><field type='jid-multi' label='People to invite' var='invitelist'><desc>Tell all your friends about your new bot!</desc></field></x>"
|
||||
.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 = "<x xmlns='jabber:x:data'/>".parse().unwrap();
|
||||
|
|
|
@ -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![],
|
||||
|
|
|
@ -626,6 +626,7 @@ mod tests {
|
|||
type_: FieldType::ListSingle,
|
||||
label: None,
|
||||
required: false,
|
||||
desc: None,
|
||||
options: vec![],
|
||||
values: vec![String::from("whitelist")],
|
||||
media: vec![],
|
||||
|
|
|
@ -92,6 +92,7 @@ pub fn generate_address_field<S: Into<String>>(var: S, values: Vec<String>) -> 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![],
|
||||
|
|
Loading…
Reference in New Issue
Block a user