xtb_client/schema/
messages.rs1use derive_setters::Setters;
2use serde::{Deserialize, Serialize};
3use serde_json::Value;
4use crate::schema::api_errors::XtbErrorCode;
5
6
7#[derive(Clone, Default, Debug, Serialize, Setters)]
9#[serde(rename_all = "camelCase")]
10#[setters(into, prefix = "with_", strip_option)]
11pub struct Request {
12 pub command: String,
14 #[serde(skip_serializing_if = "Option::is_none")]
16 pub arguments: Option<Value>,
17 pub custom_tag: Option<String>,
19}
20
21
22impl Request {
23
24 pub fn with_maybe_arguments(mut self, arguments: Option<Value>) -> Self {
36 match arguments {
37 None | Some(Value::Null) => self.arguments = None,
38 Some(Value::Object(obj)) => self.arguments = Some(Value::Object(obj)),
39 _ => panic!("Unsupported argument type. RTFM")
40 }
41 self
42 }
43}
44
45
46#[derive(Clone, Default, Debug, Deserialize)]
48#[serde(rename_all = "camelCase")]
49pub struct Response {
50 pub status: bool,
52 pub stream_session_id: Option<String>,
54 pub return_data: Option<Value>,
56 pub custom_tag: Option<String>,
58}
59
60
61#[derive(Clone, Default, Debug, Serialize, Setters)]
68#[serde(rename_all = "camelCase")]
69#[setters(into, prefix = "with_", strip_option)]
70pub struct SubscribeRequest {
71 pub command: String,
73 pub stream_session_id: String
75}
76
77
78#[derive(Clone, Default, Debug, Serialize, Setters)]
85#[serde(rename_all = "camelCase")]
86#[setters(into, prefix = "with_", strip_option)]
87pub struct UnsubscribeRequest {
88 pub command: String,
90}
91
92
93#[derive(Clone, Default, Debug, Deserialize)]
95#[serde(rename_all = "camelCase")]
96pub struct StreamDataMessage {
97 pub command: String,
99 pub data: Value
101}
102
103
104#[derive(Clone, Default, Debug, Deserialize)]
106#[serde(rename_all = "camelCase")]
107pub struct ErrorResponse {
108 pub status: bool,
110 pub error_code: XtbErrorCode,
112 pub error_descr: Option<String>,
114 pub custom_tag: Option<String>,
116}
117
118
119#[cfg(test)]
120mod tests {
121 use rstest::rstest;
122 use serde_json::{from_str, to_value, Value};
123 use crate::schema::Request;
124
125 #[rstest]
126 #[case(Request::default().with_command("command").with_arguments("argument").with_custom_tag("tag"), "{\"command\": \"command\", \"arguments\": \"argument\", \"customTag\": \"tag\"}")]
127 fn serialize_request(#[case] request: Request, #[case] expected_json: &str) {
128 let request_value = to_value(request).unwrap();
129 let expected_value: Value = from_str(expected_json).unwrap();
130 assert_eq!(request_value, expected_value)
131 }
132}