fire_http_api/stream/
message.rs1use std::borrow::Cow;
4
5use serde::{de::DeserializeOwned, Deserialize, Serialize};
6
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
8pub enum MessageKind {
9 SenderRequest,
10 SenderMessage,
11 SenderClose,
12 ReceiverRequest,
13 ReceiverMessage,
14 ReceiverClose,
15}
16
17impl MessageKind {
18 pub fn into_close(self) -> Self {
19 match self {
20 Self::SenderRequest | Self::SenderMessage | Self::SenderClose => {
21 Self::SenderClose
22 }
23 Self::ReceiverRequest
24 | Self::ReceiverMessage
25 | Self::ReceiverClose => Self::ReceiverClose,
26 }
27 }
28}
29
30#[derive(Debug, Clone, Serialize, Deserialize)]
31pub struct Message {
32 pub kind: MessageKind,
33 pub action: Cow<'static, str>,
34 #[serde(default = "MessageData::null")]
35 pub data: MessageData,
36}
37
38#[derive(Debug, Clone, Serialize, Deserialize)]
39#[serde(transparent)]
40pub struct MessageData {
41 inner: serde_json::Value,
42}
43
44impl MessageData {
45 pub fn null() -> Self {
46 Self {
47 inner: serde_json::Value::Null,
48 }
49 }
50
51 pub fn serialize<S>(value: S) -> Result<Self, serde_json::Error>
52 where
53 S: Serialize,
54 {
55 Ok(Self {
56 inner: serde_json::to_value(value)?,
57 })
58 }
59
60 pub fn deserialize<T>(self) -> Result<T, serde_json::Error>
61 where
62 T: DeserializeOwned,
63 {
64 serde_json::from_value(self.inner)
65 }
66}