dingtalk_stream/frames/down_message/
event_message.rs1use anyhow::anyhow;
2use serde::{Deserialize, Serialize};
3use std::collections::HashMap;
4use crate::frames::down_message::{DownStreamMessage, MessageHeaders};
5
6#[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}