Skip to main content

wx_sdk/mp/event/
msg_image.rs

1use 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}