binance_sdk/spot/websocket_api/models/
user_data_stream_events_response.rs1#![allow(unused_imports)]
15use crate::spot::websocket_api::models;
16use serde::{Deserialize, Deserializer, Serialize, de::Error};
17use serde_json::Value;
18
19#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
20#[serde(try_from = "Value")]
21pub enum UserDataStreamEventsResponse {
22 #[serde(rename = "balanceUpdate")]
23 BalanceUpdate(Box<models::BalanceUpdate>),
24 #[serde(rename = "eventStreamTerminated")]
25 EventStreamTerminated(Box<models::EventStreamTerminated>),
26 #[serde(rename = "executionReport")]
27 ExecutionReport(Box<models::ExecutionReport>),
28 #[serde(rename = "externalLockUpdate")]
29 ExternalLockUpdate(Box<models::ExternalLockUpdate>),
30 #[serde(rename = "listStatus")]
31 ListStatus(Box<models::ListStatus>),
32 #[serde(rename = "outboundAccountPosition")]
33 OutboundAccountPosition(Box<models::OutboundAccountPosition>),
34 Other(serde_json::Value),
35}
36
37impl Default for UserDataStreamEventsResponse {
38 fn default() -> Self {
39 Self::BalanceUpdate(Default::default())
40 }
41}
42
43impl TryFrom<Value> for UserDataStreamEventsResponse {
44 type Error = serde_json::Error;
45
46 fn try_from(v: Value) -> Result<Self, Self::Error> {
47 let tag = v
48 .get("e")
49 .and_then(Value::as_str)
50 .ok_or_else(|| serde_json::Error::custom("missing field `e`"))?;
51
52 match tag {
53 "balanceUpdate" => {
54 let payload = serde_json::from_value(v)?;
55 Ok(UserDataStreamEventsResponse::BalanceUpdate(Box::new(
56 payload,
57 )))
58 }
59
60 "eventStreamTerminated" => {
61 let payload = serde_json::from_value(v)?;
62 Ok(UserDataStreamEventsResponse::EventStreamTerminated(
63 Box::new(payload),
64 ))
65 }
66
67 "executionReport" => {
68 let payload = serde_json::from_value(v)?;
69 Ok(UserDataStreamEventsResponse::ExecutionReport(Box::new(
70 payload,
71 )))
72 }
73
74 "externalLockUpdate" => {
75 let payload = serde_json::from_value(v)?;
76 Ok(UserDataStreamEventsResponse::ExternalLockUpdate(Box::new(
77 payload,
78 )))
79 }
80
81 "listStatus" => {
82 let payload = serde_json::from_value(v)?;
83 Ok(UserDataStreamEventsResponse::ListStatus(Box::new(payload)))
84 }
85
86 "outboundAccountPosition" => {
87 let payload = serde_json::from_value(v)?;
88 Ok(UserDataStreamEventsResponse::OutboundAccountPosition(
89 Box::new(payload),
90 ))
91 }
92
93 _ => Ok(UserDataStreamEventsResponse::Other(v)),
94 }
95 }
96}