Skip to main content

valinor_wire/
envelope.rs

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}