use derive_setters::Setters;
use serde::{Deserialize, Serialize};
use serde_json::Value;
use crate::schema::api_errors::XtbErrorCode;
#[derive(Clone, Default, Debug, Serialize, Setters)]
#[serde(rename_all = "camelCase")]
#[setters(into, prefix = "with_", strip_option)]
pub struct Request {
pub command: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub arguments: Option<Value>,
pub custom_tag: Option<String>,
}
impl Request {
pub fn with_maybe_arguments(mut self, arguments: Option<Value>) -> Self {
match arguments {
None | Some(Value::Null) => self.arguments = None,
Some(Value::Object(obj)) => self.arguments = Some(Value::Object(obj)),
_ => panic!("Unsupported argument type. RTFM")
}
self
}
}
#[derive(Clone, Default, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Response {
pub status: bool,
pub stream_session_id: Option<String>,
pub return_data: Option<Value>,
pub custom_tag: Option<String>,
}
#[derive(Clone, Default, Debug, Serialize, Setters)]
#[serde(rename_all = "camelCase")]
#[setters(into, prefix = "with_", strip_option)]
pub struct SubscribeRequest {
pub command: String,
pub stream_session_id: String
}
#[derive(Clone, Default, Debug, Serialize, Setters)]
#[serde(rename_all = "camelCase")]
#[setters(into, prefix = "with_", strip_option)]
pub struct UnsubscribeRequest {
pub command: String,
}
#[derive(Clone, Default, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct StreamDataMessage {
pub command: String,
pub data: Value
}
#[derive(Clone, Default, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ErrorResponse {
pub status: bool,
pub error_code: XtbErrorCode,
pub error_descr: Option<String>,
pub custom_tag: Option<String>,
}
#[cfg(test)]
mod tests {
use rstest::rstest;
use serde_json::{from_str, to_value, Value};
use crate::schema::Request;
#[rstest]
#[case(Request::default().with_command("command").with_arguments("argument").with_custom_tag("tag"), "{\"command\": \"command\", \"arguments\": \"argument\", \"customTag\": \"tag\"}")]
fn serialize_request(#[case] request: Request, #[case] expected_json: &str) {
let request_value = to_value(request).unwrap();
let expected_value: Value = from_str(expected_json).unwrap();
assert_eq!(request_value, expected_value)
}
}