1use {
5    crate::router::{JsonUpdate, PriceFeedId, SubscriptionParams},
6    derive_more::From,
7    serde::{Deserialize, Serialize},
8};
9
10#[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#[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#[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#[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#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
90#[serde(rename_all = "camelCase")]
91pub struct ErrorResponse {
92    pub error: String,
93}
94
95#[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}