fire_http_api/stream/
message.rs

1//! The names are in the perspective of the client
2
3use 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}