1use serde::{Deserialize, Serialize};
2use thiserror::Error;
3
4#[derive(Error, Debug, PartialEq, Eq)]
5pub enum EnvelopeError {
6 #[error("invalid envelope format")]
7 InvalidFormat,
8 #[error("unknown message type: {0}")]
9 UnknownType(String),
10 #[error("decode error: {0}")]
11 Decode(String),
12 #[error("encode error: {0}")]
13 Encode(String),
14}
15
16#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
17pub struct Envelope {
18 #[serde(rename = "type")]
19 pub msg_type: String,
20 #[serde(skip_serializing_if = "Option::is_none")]
21 pub request_id: Option<String>,
22 pub payload: serde_json::Value,
23}
24
25impl Envelope {
26 pub fn request(
27 msg_type: impl Into<String>,
28 request_id: String,
29 payload: serde_json::Value,
30 ) -> Self {
31 Self {
32 msg_type: msg_type.into(),
33 request_id: Some(request_id),
34 payload,
35 }
36 }
37
38 pub fn event(msg_type: impl Into<String>, payload: serde_json::Value) -> Self {
39 Self {
40 msg_type: msg_type.into(),
41 request_id: None,
42 payload,
43 }
44 }
45
46 pub fn response(request_id: String, payload: serde_json::Value) -> Self {
47 Self {
48 msg_type: "response".to_string(),
49 request_id: Some(request_id),
50 payload,
51 }
52 }
53
54 pub fn error(request_id: Option<String>, code: &str, message: &str) -> Self {
55 Self {
56 msg_type: "error".to_string(),
57 request_id,
58 payload: serde_json::json!({
59 "code": code,
60 "message": message
61 }),
62 }
63 }
64}