wx-sdk 0.0.9

A Wechat SDK written in Rust
Documentation
use crate::{
    mp::event::{xmlutil::get_text_from_root, ReceivedMessageParser},
    SdkResult,
};

pub struct ViewEvent {
    pub event_key: String,
    pub menu_id: Option<String>,
}

impl ReceivedMessageParser for ViewEvent {
    type ReceivedMessage = ViewEvent;

    fn from_xml(node: &roxmltree::Node) -> SdkResult<Self::ReceivedMessage> {
        let event_key = get_text_from_root(node, "EventKey")?;
        let menu_id = node
            .descendants()
            .find(|n| n.has_tag_name("MenuId"))
            .map(|n| n.text())
            .flatten()
            .map(|s| s.to_string());
        Ok(ViewEvent {
            event_key: event_key.to_string(),
            menu_id,
        })
    }
}
#[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>123456789</CreateTime>
    <MsgType><![CDATA[event]]></MsgType>
    <Event><![CDATA[VIEW]]></Event>
    <EventKey><![CDATA[www.qq.com]]></EventKey>
    <MenuId>MENUID</MenuId>
    </xml>
    ";
        let node = Document::parse(&s)?;
        let msg = ViewEvent::from_xml(&node.root())?;

        assert_eq!(msg.event_key, "www.qq.com");
        assert_eq!(msg.menu_id, Some("MENUID".to_string()));
        Ok(())
    }
}