rustrade_data/exchange/binance/
subscription.rs1use rustrade_integration::{Validator, error::SocketError};
2use serde::{Deserialize, Serialize};
3
4#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Deserialize, Serialize)]
24pub struct BinanceSubResponse {
25 result: Option<Vec<String>>,
26 id: u32,
27}
28
29impl Validator for BinanceSubResponse {
30 type Error = SocketError;
31
32 fn validate(self) -> Result<Self, Self::Error>
33 where
34 Self: Sized,
35 {
36 if self.result.is_none() {
37 Ok(self)
38 } else {
39 Err(SocketError::Subscribe(
40 "received failure subscription response".to_owned(),
41 ))
42 }
43 }
44}
45
46#[cfg(test)]
47mod tests {
48 use super::*;
49
50 mod de {
51 use super::*;
52
53 #[test]
54 fn test_binance_sub_response() {
55 struct TestCase {
56 input: &'static str,
57 expected: Result<BinanceSubResponse, SocketError>,
58 }
59
60 let cases = vec![
61 TestCase {
62 input: r#"{"id":1,"result":null}"#,
64 expected: Ok(BinanceSubResponse {
65 result: None,
66 id: 1,
67 }),
68 },
69 TestCase {
70 input: r#"{"result": [], "id": 1}"#,
72 expected: Ok(BinanceSubResponse {
73 result: Some(vec![]),
74 id: 1,
75 }),
76 },
77 ];
78
79 for (index, test) in cases.into_iter().enumerate() {
80 let actual = serde_json::from_str::<BinanceSubResponse>(test.input);
81 match (actual, test.expected) {
82 (Ok(actual), Ok(expected)) => {
83 assert_eq!(actual, expected, "TC{} failed", index)
84 }
85 (Err(_), Err(_)) => {
86 }
88 (actual, expected) => {
89 panic!(
91 "TC{index} failed because actual != expected. \nActual: {actual:?}\nExpected: {expected:?}\n"
92 );
93 }
94 }
95 }
96 }
97 }
98
99 #[test]
100 fn test_validate_binance_sub_response() {
101 struct TestCase {
102 input_response: BinanceSubResponse,
103 is_valid: bool,
104 }
105
106 let cases = vec![
107 TestCase {
108 input_response: BinanceSubResponse {
110 result: None,
111 id: 1,
112 },
113 is_valid: true,
114 },
115 TestCase {
116 input_response: BinanceSubResponse {
118 result: Some(vec![]),
119 id: 1,
120 },
121 is_valid: false,
122 },
123 ];
124
125 for (index, test) in cases.into_iter().enumerate() {
126 let actual = test.input_response.validate().is_ok();
127 assert_eq!(actual, test.is_valid, "TestCase {} failed", index);
128 }
129 }
130}