wx_sdk/mp/event/
msg_image.rs1use roxmltree::Node;
2
3use crate::SdkResult;
4
5use super::{
6 xmlutil::{get_number_from_root, get_text_from_root},
7 ReceivedMessageParser,
8};
9
10pub struct ImageMessage {
11 pub msg_id: u64,
12 pub pic_url: String,
13 pub media_id: String,
14}
15
16impl ReceivedMessageParser for ImageMessage {
17 type ReceivedMessage = Self;
18
19 fn from_xml(node: &Node) -> SdkResult<Self::ReceivedMessage> {
20 let msg_id = get_number_from_root::<u64>(node, "MsgId")?;
21 let pic_url = get_text_from_root(node, "PicUrl")?;
22 let media_id = get_text_from_root(node, "MediaId")?;
23
24 Ok(ImageMessage {
25 msg_id,
26 pic_url: pic_url.to_owned(),
27 media_id: media_id.to_owned(),
28 })
29 }
30}
31
32#[cfg(test)]
33mod tests {
34 use super::*;
35 use crate::SdkResult;
36 #[test]
37 pub fn parse() -> SdkResult<()> {
38 use roxmltree::Document;
39
40 let s = "<xml>
41 <ToUserName><![CDATA[toUser]]></ToUserName>
42 <FromUserName><![CDATA[fromUser]]></FromUserName>
43 <CreateTime>1348831860</CreateTime>
44 <MsgType><![CDATA[image]]></MsgType>
45 <PicUrl><![CDATA[this is a url]]></PicUrl>
46 <MediaId><![CDATA[media_id]]></MediaId>
47 <MsgId>1234567890123456</MsgId>
48 </xml>";
49 let node = Document::parse(&s)?;
50 let msg = ImageMessage::from_xml(&node.root())?;
51 assert_eq!(msg.pic_url, "this is a url");
52 assert_eq!(msg.media_id, "media_id");
53 assert_eq!(msg.msg_id, 1234567890123456);
54 Ok(())
55 }
56}