xmpp-parsers: Convert media_element to xso
The API changed here, URI became Uri to be more in line with the coding style. Also we don’t attempt to trim them any more because that was only used in the examples, and nowhere in the text of the specification did it say that those had to be trimmed.
This commit is contained in:
parent
2b333ce579
commit
0c9e478994
1 changed files with 34 additions and 42 deletions
|
|
@ -4,26 +4,28 @@
|
||||||
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
// 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/.
|
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
|
||||||
use crate::util::text_node_codecs::{Codec, Text, Trimmed};
|
use xso::{text::EmptyAsError, AsXml, FromXml};
|
||||||
|
|
||||||
generate_element!(
|
use crate::ns;
|
||||||
/// Represents an URI used in a media element.
|
|
||||||
URI, "uri", MEDIA_ELEMENT,
|
/// Represents an URI used in a media element.
|
||||||
attributes: [
|
#[derive(FromXml, AsXml, PartialEq, Debug, Clone)]
|
||||||
/// The MIME type of the URI referenced.
|
#[xml(namespace = ns::MEDIA_ELEMENT, name = "uri")]
|
||||||
///
|
pub struct Uri {
|
||||||
/// See the [IANA MIME Media Types Registry][1] for a list of
|
/// The MIME type of the URI referenced.
|
||||||
/// registered types, but unregistered or yet-to-be-registered are
|
///
|
||||||
/// accepted too.
|
/// See the [IANA MIME Media Types Registry][1] for a list of
|
||||||
///
|
/// registered types, but unregistered or yet-to-be-registered are
|
||||||
/// [1]: <https://www.iana.org/assignments/media-types/media-types.xhtml>
|
/// accepted too.
|
||||||
type_: Required<String> = "type"
|
///
|
||||||
],
|
/// [1]: <https://www.iana.org/assignments/media-types/media-types.xhtml>
|
||||||
text: (
|
#[xml(attribute(name = "type"))]
|
||||||
/// The actual URI contained.
|
pub type_: String,
|
||||||
uri: Trimmed<Text>
|
|
||||||
)
|
/// The actual URI contained.
|
||||||
);
|
#[xml(text(codec = EmptyAsError))]
|
||||||
|
pub uri: String,
|
||||||
|
}
|
||||||
|
|
||||||
generate_element!(
|
generate_element!(
|
||||||
/// References a media element, to be used in [data
|
/// References a media element, to be used in [data
|
||||||
|
|
@ -38,7 +40,7 @@ generate_element!(
|
||||||
],
|
],
|
||||||
children: [
|
children: [
|
||||||
/// A list of URIs referencing this media.
|
/// A list of URIs referencing this media.
|
||||||
uris: Vec<URI> = ("uri", MEDIA_ELEMENT) => URI
|
uris: Vec<Uri> = ("uri", MEDIA_ELEMENT) => Uri
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
@ -52,14 +54,14 @@ mod tests {
|
||||||
#[cfg(target_pointer_width = "32")]
|
#[cfg(target_pointer_width = "32")]
|
||||||
#[test]
|
#[test]
|
||||||
fn test_size() {
|
fn test_size() {
|
||||||
assert_size!(URI, 24);
|
assert_size!(Uri, 24);
|
||||||
assert_size!(MediaElement, 28);
|
assert_size!(MediaElement, 28);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(target_pointer_width = "64")]
|
#[cfg(target_pointer_width = "64")]
|
||||||
#[test]
|
#[test]
|
||||||
fn test_size() {
|
fn test_size() {
|
||||||
assert_size!(URI, 48);
|
assert_size!(Uri, 48);
|
||||||
assert_size!(MediaElement, 56);
|
assert_size!(MediaElement, 56);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -174,7 +176,10 @@ mod tests {
|
||||||
FromElementError::Invalid(Error::Other(string)) => string,
|
FromElementError::Invalid(Error::Other(string)) => string,
|
||||||
_ => panic!(),
|
_ => panic!(),
|
||||||
};
|
};
|
||||||
assert_eq!(message, "Required attribute 'type' missing.");
|
assert_eq!(
|
||||||
|
message,
|
||||||
|
"Required attribute field 'type_' on Uri element missing."
|
||||||
|
);
|
||||||
|
|
||||||
let elem: Element = "<media xmlns='urn:xmpp:media-element'><uri type='text/html'/></media>"
|
let elem: Element = "<media xmlns='urn:xmpp:media-element'><uri type='text/html'/></media>"
|
||||||
.parse()
|
.parse()
|
||||||
|
|
@ -184,24 +189,15 @@ mod tests {
|
||||||
FromElementError::Invalid(Error::Other(string)) => string,
|
FromElementError::Invalid(Error::Other(string)) => string,
|
||||||
_ => panic!(),
|
_ => panic!(),
|
||||||
};
|
};
|
||||||
assert_eq!(
|
assert_eq!(message, "Empty text node.");
|
||||||
message,
|
|
||||||
"The text in the element's text node was empty after trimming."
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_xep_ex1() {
|
fn test_xep_ex1() {
|
||||||
let elem: Element = r#"<media xmlns='urn:xmpp:media-element'>
|
let elem: Element = r#"<media xmlns='urn:xmpp:media-element'>
|
||||||
<uri type='audio/x-wav'>
|
<uri type='audio/x-wav'>http://victim.example.com/challenges/speech.wav?F3A6292C</uri>
|
||||||
http://victim.example.com/challenges/speech.wav?F3A6292C
|
<uri type='audio/ogg; codecs=speex'>cid:sha1+a15a505e360702b79c75a5f67773072ed392f52a@bob.xmpp.org</uri>
|
||||||
</uri>
|
<uri type='audio/mpeg'>http://victim.example.com/challenges/speech.mp3?F3A6292C</uri>
|
||||||
<uri type='audio/ogg; codecs=speex'>
|
|
||||||
cid:sha1+a15a505e360702b79c75a5f67773072ed392f52a@bob.xmpp.org
|
|
||||||
</uri>
|
|
||||||
<uri type='audio/mpeg'>
|
|
||||||
http://victim.example.com/challenges/speech.mp3?F3A6292C
|
|
||||||
</uri>
|
|
||||||
</media>"#
|
</media>"#
|
||||||
.parse()
|
.parse()
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
@ -234,12 +230,8 @@ mod tests {
|
||||||
<media xmlns='urn:xmpp:media-element'
|
<media xmlns='urn:xmpp:media-element'
|
||||||
height='80'
|
height='80'
|
||||||
width='290'>
|
width='290'>
|
||||||
<uri type='image/jpeg'>
|
<uri type='image/jpeg'>http://www.victim.com/challenges/ocr.jpeg?F3A6292C</uri>
|
||||||
http://www.victim.com/challenges/ocr.jpeg?F3A6292C
|
<uri type='image/jpeg'>cid:sha1+f24030b8d91d233bac14777be5ab531ca3b9f102@bob.xmpp.org</uri>
|
||||||
</uri>
|
|
||||||
<uri type='image/jpeg'>
|
|
||||||
cid:sha1+f24030b8d91d233bac14777be5ab531ca3b9f102@bob.xmpp.org
|
|
||||||
</uri>
|
|
||||||
</media>
|
</media>
|
||||||
</field>
|
</field>
|
||||||
[ ... ]
|
[ ... ]
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue