bitbank_api/private/
assets.rs

1use super::*;
2
3#[derive(TypedBuilder)]
4pub struct Params {}
5
6#[serde_as]
7#[derive(strum::EnumString, Deserialize, Debug)]
8#[serde(untagged)]
9pub enum WithdrawalFee {
10    Crypto(#[serde_as(as = "DisplayFromStr")] f64),
11    Fiat {
12        #[serde_as(as = "DisplayFromStr")]
13        under: f64,
14        #[serde_as(as = "DisplayFromStr")]
15        over: f64,
16        #[serde_as(as = "DisplayFromStr")]
17        threshold: f64,
18    },
19}
20
21#[serde_as]
22#[derive(Deserialize, Debug)]
23pub struct AssetInfo {
24    #[serde_as(as = "DisplayFromStr")]
25    pub asset: Asset,
26    #[serde_as(as = "DisplayFromStr")]
27    pub free_amount: f64,
28    pub amount_precision: u8,
29    #[serde_as(as = "DisplayFromStr")]
30    pub onhand_amount: f64,
31    #[serde_as(as = "DisplayFromStr")]
32    pub locked_amount: f64,
33    pub withdrawal_fee: WithdrawalFee,
34    pub stop_deposit: bool,
35    pub stop_withdrawal: bool,
36}
37
38#[derive(Deserialize)]
39struct Response {
40    assets: Vec<AssetInfo>,
41}
42
43pub async fn get(cred: Credential, _: Params) -> anyhow::Result<Vec<AssetInfo>> {
44    let resp: Response = ApiExec { cred }
45        .get("/v1/user/assets", "".to_owned())
46        .await?;
47    Ok(resp.assets)
48}
49
50#[cfg(test)]
51mod tests {
52    use super::*;
53
54    #[test]
55    fn test_withdrawal_deser() -> anyhow::Result<()> {
56        let s = r#"
57		"100.0"
58		"#;
59        let x: WithdrawalFee = serde_json::from_str(&s)?;
60        dbg!(&x);
61
62        let s = r#"
63		{
64            "under": "1.0",
65            "over": "2.0",
66            "threshold": "3.0"
67        }
68		"#;
69        let x: WithdrawalFee = serde_json::from_str(&s)?;
70        dbg!(&x);
71
72        Ok(())
73    }
74}