wx-sdk 0.0.9

A Wechat SDK written in Rust
Documentation
use roxmltree::Node;

use crate::SdkResult;

use super::{
    xmlutil::{get_number_from_root, get_text_from_root},
    ReceivedMessageParser,
};

pub struct ImageMessage {
    pub msg_id: u64,
    pub pic_url: String,
    pub media_id: String,
}

impl ReceivedMessageParser for ImageMessage {
    type ReceivedMessage = Self;

    fn from_xml(node: &Node) -> SdkResult<Self::ReceivedMessage> {
        let msg_id = get_number_from_root::<u64>(node, "MsgId")?;
        let pic_url = get_text_from_root(node, "PicUrl")?;
        let media_id = get_text_from_root(node, "MediaId")?;

        Ok(ImageMessage {
            msg_id,
            pic_url: pic_url.to_owned(),
            media_id: media_id.to_owned(),
        })
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use crate::SdkResult;
    #[test]
    pub fn parse() -> SdkResult<()> {
        use roxmltree::Document;

        let s = "<xml>
    <ToUserName><![CDATA[toUser]]></ToUserName>
    <FromUserName><![CDATA[fromUser]]></FromUserName>
    <CreateTime>1348831860</CreateTime>
    <MsgType><![CDATA[image]]></MsgType>
    <PicUrl><![CDATA[this is a url]]></PicUrl>
    <MediaId><![CDATA[media_id]]></MediaId>
    <MsgId>1234567890123456</MsgId>
  </xml>";
        let node = Document::parse(&s)?;
        let msg = ImageMessage::from_xml(&node.root())?;
        assert_eq!(msg.pic_url, "this is a url");
        assert_eq!(msg.media_id, "media_id");
        assert_eq!(msg.msg_id, 1234567890123456);
        Ok(())
    }
}