use serde::{Deserialize, Serialize};
use crate::types::MarketId;
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub struct CreateSubAccount {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub explicit_index: Option<u32>,
pub shared_stp_group: bool,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub struct SubAccountTransfer {
pub sub_index: u32,
pub deposit: bool,
pub amount: String,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub struct SubAccountSpotTransfer {
pub sub_index: u32,
pub token: MarketId,
pub deposit: bool,
pub amount: String,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn create_sub_account_omits_absent_index() {
let a = CreateSubAccount {
name: "bot".into(),
explicit_index: None,
shared_stp_group: false,
};
let j = serde_json::to_value(&a).unwrap();
assert!(j.get("explicit_index").is_none(), "absent index omitted");
assert_eq!(j["name"], serde_json::json!("bot"));
let dec: CreateSubAccount = serde_json::from_value(j).unwrap();
assert_eq!(a, dec);
}
#[test]
fn create_sub_account_keeps_present_index() {
let a = CreateSubAccount {
name: "bot".into(),
explicit_index: Some(5),
shared_stp_group: true,
};
let j = serde_json::to_value(&a).unwrap();
assert_eq!(j["explicit_index"], serde_json::json!(5));
}
#[test]
fn sub_account_transfer_amount_rides_as_string() {
let a = SubAccountTransfer {
sub_index: 0,
deposit: true,
amount: "100.5".into(),
};
let j = serde_json::to_value(&a).unwrap();
assert!(j["amount"].is_string());
assert_eq!(j["amount"], serde_json::json!("100.5"));
}
#[test]
fn sub_account_spot_transfer_token_is_plain_integer() {
let a = SubAccountSpotTransfer {
sub_index: 2,
token: MarketId(7),
deposit: false,
amount: "42.0".into(),
};
let j = serde_json::to_value(&a).unwrap();
assert_eq!(j["token"], serde_json::json!(7));
assert_eq!(j["amount"], serde_json::json!("42.0"));
}
}