wx-sdk 0.0.9

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

use super::{event_scan::ScanEvent, EventMessage};

pub struct SubScribeEvent;

impl ReceivedMessageParser for SubScribeEvent {
    type ReceivedMessage = EventMessage;

    fn from_xml(node: &roxmltree::Node) -> SdkResult<Self::ReceivedMessage> {
        let ekn = node.descendants().find(|n| n.has_tag_name("EventKey"));
        let event = match ekn {
            Some(n) => {
                let event_key = n.text().ok_or_else(|| {
                    SdkError::InvalidParams(format!(
                        "Parse XML msg from wechat error: tag `{}` text content is none",
                        n.tag_name().name()
                    ))
                })?;
                let ticket = get_text_from_root(node, "Ticket")?;
                EventMessage::SubscribeScan(ScanEvent {
                    event_key: event_key.to_string(),
                    ticket: ticket.to_string(),
                })
            }
            None => EventMessage::Subscribe,
        };
        Ok(event)
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use crate::mp::event::EventMessage;
    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[subscribe]]></Event>
    <EventKey><![CDATA[qrscene_123123]]></EventKey>
    <Ticket><![CDATA[TICKET]]></Ticket>
</xml>";
        let node = Document::parse(&s)?;
        let msg = SubScribeEvent::from_xml(&node.root())?;

        matches!(msg, EventMessage::SubscribeScan(_));
        Ok(())
    }
}