Skip to main content

dingtalk_stream/frames/down_message/
event_message.rs

1use anyhow::anyhow;
2use serde::{Deserialize, Serialize};
3use std::collections::HashMap;
4use crate::frames::down_message::{DownStreamMessage, MessageHeaders};
5
6/// Event message
7#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct EventMessage {
9    #[serde(rename = "specVersion")]
10    pub spec_version: Option<String>,
11    #[serde(rename = "type")]
12    pub headers: MessageHeaders,
13    pub data: Option<serde_json::Value>,
14    #[serde(flatten)]
15    pub extensions: HashMap<String, serde_json::Value>,
16}
17
18impl TryFrom<DownStreamMessage> for EventMessage {
19    type Error = anyhow::Error;
20
21    fn try_from(
22        DownStreamMessage {
23            spec_version,
24            headers,
25            r#type,
26            data,
27            extensions,
28        }: DownStreamMessage,
29    ) -> crate::Result<Self> {
30        if let super::MessageType::Event = r#type {
31            Ok(Self {
32                spec_version,
33                headers,
34                data: if let Some(data) = data {
35                    serde_json::from_str(&data)?
36                } else {
37                    None
38                },
39                extensions,
40            })
41        } else {
42            Err(anyhow!("expected event message"))
43        }
44    }
45}