kraken_async_rs/wss/messages/
admin_messages.rs

1use crate::response_types::SystemStatus;
2use serde::Deserialize;
3use serde_json::Number;
4
5#[derive(Debug, Deserialize, PartialEq)]
6pub struct StatusUpdate {
7    pub api_version: String,
8    // true type is i128, but serde does not support it: https://github.com/serde-rs/json/issues/740
9    pub connection_id: Option<Number>,
10    pub system: SystemStatus,
11    pub version: String,
12}
13
14#[cfg(test)]
15mod tests {
16    use super::*;
17    use std::str::FromStr;
18
19    /// ['serde_json'] doesn't support i128 natively, so using the Number type allows parsing. If
20    /// users need access to it, Number can be converted to i128 with additional serde features.
21    #[test]
22    fn test_deserialize_status_update() {
23        let message = r#"{"api_version":"v2","connection_id":18266300427528990701,"system":"online","version":"2.0.4"}"#;
24        let expected = StatusUpdate {
25            api_version: "v2".to_string(),
26            connection_id: Some(Number::from_str("18266300427528990701").unwrap()),
27            system: SystemStatus::Online,
28            version: "2.0.4".to_string(),
29        };
30
31        let parsed = serde_json::from_str::<StatusUpdate>(message);
32
33        assert_eq!(expected, parsed.unwrap());
34
35        // what's needed after adding features = ["arbitrary_precision"] for serde_json
36
37        // let expected_connection_id: i128 = 18266300427528990701;
38        // let connection_id: i128 = i128::from_str(parsed.unwrap().connection_id.as_str()).unwrap();
39        // assert_eq!(expected_connection_id, connection_id);
40    }
41}