nautilus_bybit/http/
parse.rs1use super::models::{
19 BybitInstrumentInverseResponse, BybitInstrumentLinearResponse, BybitInstrumentOptionResponse,
20 BybitInstrumentSpotResponse, BybitKlinesResponse, BybitServerTimeResponse,
21 BybitTickersLinearResponse, BybitTickersOptionResponse, BybitTickersSpotResponse,
22 BybitTradesResponse,
23};
24use crate::common::models::BybitResponse;
25
26pub fn parse_server_time_response(data: &[u8]) -> anyhow::Result<BybitServerTimeResponse> {
32 let response = serde_json::from_slice::<BybitServerTimeResponse>(data)?;
33 validate_response(&response)?;
34 Ok(response)
35}
36
37pub fn parse_instruments_spot_response(data: &[u8]) -> anyhow::Result<BybitInstrumentSpotResponse> {
43 let response = serde_json::from_slice::<BybitInstrumentSpotResponse>(data)?;
44 validate_response(&response)?;
45 Ok(response)
46}
47
48pub fn parse_instruments_linear_response(
54 data: &[u8],
55) -> anyhow::Result<BybitInstrumentLinearResponse> {
56 let response = serde_json::from_slice::<BybitInstrumentLinearResponse>(data)?;
57 validate_response(&response)?;
58 Ok(response)
59}
60
61pub fn parse_instruments_inverse_response(
67 data: &[u8],
68) -> anyhow::Result<BybitInstrumentInverseResponse> {
69 let response = serde_json::from_slice::<BybitInstrumentInverseResponse>(data)?;
70 validate_response(&response)?;
71 Ok(response)
72}
73
74pub fn parse_instruments_option_response(
80 data: &[u8],
81) -> anyhow::Result<BybitInstrumentOptionResponse> {
82 let response = serde_json::from_slice::<BybitInstrumentOptionResponse>(data)?;
83 validate_response(&response)?;
84 Ok(response)
85}
86
87pub fn parse_tickers_spot_response(data: &[u8]) -> anyhow::Result<BybitTickersSpotResponse> {
93 let response = serde_json::from_slice::<BybitTickersSpotResponse>(data)?;
94 validate_response(&response)?;
95 Ok(response)
96}
97
98pub fn parse_tickers_linear_response(data: &[u8]) -> anyhow::Result<BybitTickersLinearResponse> {
104 let response = serde_json::from_slice::<BybitTickersLinearResponse>(data)?;
105 validate_response(&response)?;
106 Ok(response)
107}
108
109pub fn parse_tickers_option_response(data: &[u8]) -> anyhow::Result<BybitTickersOptionResponse> {
115 let response = serde_json::from_slice::<BybitTickersOptionResponse>(data)?;
116 validate_response(&response)?;
117 Ok(response)
118}
119
120pub fn parse_klines_response(data: &[u8]) -> anyhow::Result<BybitKlinesResponse> {
126 let response = serde_json::from_slice::<BybitKlinesResponse>(data)?;
127 validate_response(&response)?;
128 Ok(response)
129}
130
131pub fn parse_trades_response(data: &[u8]) -> anyhow::Result<BybitTradesResponse> {
137 let response = serde_json::from_slice::<BybitTradesResponse>(data)?;
138 validate_response(&response)?;
139 Ok(response)
140}
141
142fn validate_response<T>(response: &BybitResponse<T>) -> anyhow::Result<()> {
148 if response.ret_code != 0 {
149 anyhow::bail!(
150 "Bybit API error {}: {}",
151 response.ret_code,
152 response.ret_msg
153 );
154 }
155 Ok(())
156}
157
158#[cfg(test)]
163mod tests {
164 use rstest::rstest;
165
166 use super::*;
167 use crate::common::testing::load_test_json;
168
169 #[rstest]
170 fn test_parse_instruments_linear_response() {
171 let json = load_test_json("http_get_instruments_linear.json");
172 let result = parse_instruments_linear_response(json.as_bytes());
173 assert!(result.is_ok());
174
175 let response = result.unwrap();
176 assert_eq!(response.ret_code, 0);
177 assert!(!response.result.list.is_empty());
178 }
179
180 #[rstest]
181 fn test_parse_instruments_spot_response() {
182 let json = load_test_json("http_get_instruments_spot.json");
183 let result = parse_instruments_spot_response(json.as_bytes());
184 assert!(result.is_ok());
185
186 let response = result.unwrap();
187 assert_eq!(response.ret_code, 0);
188 assert!(!response.result.list.is_empty());
189 }
190
191 #[rstest]
192 fn test_parse_instruments_inverse_response() {
193 let json = load_test_json("http_get_instruments_inverse.json");
194 let result = parse_instruments_inverse_response(json.as_bytes());
195 assert!(result.is_ok());
196
197 let response = result.unwrap();
198 assert_eq!(response.ret_code, 0);
199 assert!(!response.result.list.is_empty());
200 }
201
202 #[rstest]
203 fn test_parse_instruments_option_response() {
204 let json = load_test_json("http_get_instruments_option.json");
205 let result = parse_instruments_option_response(json.as_bytes());
206 assert!(result.is_ok());
207
208 let response = result.unwrap();
209 assert_eq!(response.ret_code, 0);
210 assert!(!response.result.list.is_empty());
211 }
212
213 #[rstest]
214 fn test_parse_klines_response() {
215 let json = load_test_json("http_get_klines_linear.json");
216 let result = parse_klines_response(json.as_bytes());
217 assert!(result.is_ok());
218
219 let response = result.unwrap();
220 assert_eq!(response.ret_code, 0);
221 assert!(!response.result.list.is_empty());
222 }
223
224 #[rstest]
225 fn test_parse_trades_response() {
226 let json = load_test_json("http_get_trades_recent.json");
227 let result = parse_trades_response(json.as_bytes());
228 assert!(result.is_ok());
229
230 let response = result.unwrap();
231 assert_eq!(response.ret_code, 0);
232 assert!(!response.result.list.is_empty());
233 }
234}