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