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, PriceFeedId, 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, PartialEq, Eq, Hash, 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, PartialOrd, Ord, Serialize, Deserialize)]
20pub struct SubscriptionId(pub u64);
21
22#[derive(Debug, Clone, PartialEq, Eq, Hash, 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, PartialEq, Eq, Hash, 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    SubscribedWithInvalidFeedIdsIgnored(SubscribedWithInvalidFeedIdsIgnoredResponse),
44    Unsubscribed(UnsubscribedResponse),
45    SubscriptionError(SubscriptionErrorResponse),
46    StreamUpdated(StreamUpdatedResponse),
47}
48
49/// Sent from the server after a successul subscription.
50#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
51#[serde(rename_all = "camelCase")]
52pub struct SubscribedResponse {
53    pub subscription_id: SubscriptionId,
54}
55
56#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
57#[serde(rename_all = "camelCase")]
58pub struct InvalidFeedSubscriptionDetails {
59    pub unknown_ids: Vec<PriceFeedId>,
60    pub unsupported_channels: Vec<PriceFeedId>,
61    pub unstable: Vec<PriceFeedId>,
62}
63
64#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
65#[serde(rename_all = "camelCase")]
66pub struct SubscribedWithInvalidFeedIdsIgnoredResponse {
67    pub subscription_id: SubscriptionId,
68    pub subscribed_feed_ids: Vec<PriceFeedId>,
69    pub ignored_invalid_feed_ids: InvalidFeedSubscriptionDetails,
70}
71
72#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
73#[serde(rename_all = "camelCase")]
74pub struct UnsubscribedResponse {
75    pub subscription_id: SubscriptionId,
76}
77
78/// Sent from the server if the requested subscription or unsubscription request
79/// could not be fulfilled.
80#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
81#[serde(rename_all = "camelCase")]
82pub struct SubscriptionErrorResponse {
83    pub subscription_id: SubscriptionId,
84    pub error: String,
85}
86
87/// Sent from the server if an internal error occured while serving data for an existing subscription,
88/// or a client request sent a bad request.
89#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
90#[serde(rename_all = "camelCase")]
91pub struct ErrorResponse {
92    pub error: String,
93}
94
95/// Sent from the server when new data is available for an existing subscription
96/// (only if `delivery_format == Json`).
97#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
98#[serde(rename_all = "camelCase")]
99pub struct StreamUpdatedResponse {
100    pub subscription_id: SubscriptionId,
101    #[serde(flatten)]
102    pub payload: JsonUpdate,
103}