barter_data/exchange/gateio/
mod.rs1use self::{channel::GateioChannel, market::GateioMarket, subscription::GateioSubResponse};
2use crate::{
3 ExchangeWsStream,
4 exchange::{Connector, ExchangeServer, subscription::ExchangeSub},
5 subscriber::{WebSocketSubscriber, validator::WebSocketSubValidator},
6};
7use barter_instrument::exchange::ExchangeId;
8use barter_integration::protocol::websocket::{WebSocketSerdeParser, WsMessage};
9use serde_json::json;
10use std::{fmt::Debug, marker::PhantomData};
11use url::Url;
12
13pub mod channel;
16
17pub mod spot;
20
21pub mod future;
25
26pub mod perpetual;
30
31pub mod option;
34
35pub mod market;
38
39pub mod message;
43
44pub mod subscription;
49
50pub type GateiotWsStream<Transformer> = ExchangeWsStream<WebSocketSerdeParser, Transformer>;
52
53#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Default)]
60pub struct Gateio<Server> {
61 server: PhantomData<Server>,
62}
63
64impl<Server> Connector for Gateio<Server>
65where
66 Server: ExchangeServer,
67{
68 const ID: ExchangeId = Server::ID;
69 type Channel = GateioChannel;
70 type Market = GateioMarket;
71 type Subscriber = WebSocketSubscriber;
72 type SubValidator = WebSocketSubValidator;
73 type SubResponse = GateioSubResponse;
74
75 fn url() -> Result<Url, url::ParseError> {
76 Url::parse(Server::websocket_url())
77 }
78
79 fn requests(exchange_subs: Vec<ExchangeSub<Self::Channel, Self::Market>>) -> Vec<WsMessage> {
80 exchange_subs
81 .into_iter()
82 .map(|ExchangeSub { channel, market }| {
83 WsMessage::text(
84 json!({
85 "time": chrono::Utc::now().timestamp_millis(),
86 "channel": channel.as_ref(),
87 "event": "subscribe",
88 "payload": [market.as_ref()]
89 })
90 .to_string(),
91 )
92 })
93 .collect()
94 }
95}
96
97impl<'de, Server> serde::Deserialize<'de> for Gateio<Server>
98where
99 Server: ExchangeServer,
100{
101 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
102 where
103 D: serde::de::Deserializer<'de>,
104 {
105 let input = <String as serde::Deserialize>::deserialize(deserializer)?;
106 if input.as_str() == Self::ID.as_str() {
107 Ok(Self::default())
108 } else {
109 Err(serde::de::Error::invalid_value(
110 serde::de::Unexpected::Str(input.as_str()),
111 &Self::ID.as_str(),
112 ))
113 }
114 }
115}
116
117impl<Server> serde::Serialize for Gateio<Server>
118where
119 Server: ExchangeServer,
120{
121 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
122 where
123 S: serde::ser::Serializer,
124 {
125 serializer.serialize_str(Self::ID.as_str())
126 }
127}