pyth_lazer_protocol/
subscription.rs

1//! Types descibing general WebSocket subscription/unsubscription JSON messages
2//! used across publishers, agents and routers.
3
4use {
5    crate::router::{JsonUpdate, SubscriptionParams},
6    derive_more::From,
7    serde::{Deserialize, Serialize},
8};
9
10/// A request sent from the client to the server.
11#[derive(Debug, Clone, Serialize, Deserialize)]
12#[serde(tag = "type")]
13#[serde(rename_all = "camelCase")]
14pub enum Request {
15    Subscribe(SubscribeRequest),
16    Unsubscribe(UnsubscribeRequest),
17}
18
19#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
20pub struct SubscriptionId(pub u64);
21
22#[derive(Debug, Clone, Serialize, Deserialize)]
23#[serde(rename_all = "camelCase")]
24pub struct SubscribeRequest {
25    pub subscription_id: SubscriptionId,
26    #[serde(flatten)]
27    pub params: SubscriptionParams,
28}
29
30#[derive(Debug, Clone, Serialize, Deserialize)]
31#[serde(rename_all = "camelCase")]
32pub struct UnsubscribeRequest {
33    pub subscription_id: SubscriptionId,
34}
35
36/// A JSON response sent from the server to the client.
37#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize, From)]
38#[serde(tag = "type")]
39#[serde(rename_all = "camelCase")]
40pub enum Response {
41    Error(ErrorResponse),
42    Subscribed(SubscribedResponse),
43    Unsubscribed(UnsubscribedResponse),
44    SubscriptionError(SubscriptionErrorResponse),
45    StreamUpdated(StreamUpdatedResponse),
46}
47
48/// Sent from the server after a successul subscription.
49#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
50#[serde(rename_all = "camelCase")]
51pub struct SubscribedResponse {
52    pub subscription_id: SubscriptionId,
53}
54
55#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
56#[serde(rename_all = "camelCase")]
57pub struct UnsubscribedResponse {
58    pub subscription_id: SubscriptionId,
59}
60
61/// Sent from the server if the requested subscription or unsubscription request
62/// could not be fulfilled.
63#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
64#[serde(rename_all = "camelCase")]
65pub struct SubscriptionErrorResponse {
66    pub subscription_id: SubscriptionId,
67    pub error: String,
68}
69
70/// Sent from the server if an internal error occured while serving data for an existing subscription,
71/// or a client request sent a bad request.
72#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
73#[serde(rename_all = "camelCase")]
74pub struct ErrorResponse {
75    pub error: String,
76}
77
78/// Sent from the server when new data is available for an existing subscription
79/// (only if `delivery_format == Json`).
80#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
81#[serde(rename_all = "camelCase")]
82pub struct StreamUpdatedResponse {
83    pub subscription_id: SubscriptionId,
84    #[serde(flatten)]
85    pub payload: JsonUpdate,
86}