1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
use std::str::FromStr;

use chrono::{DateTime, LocalResult, TimeZone, Utc};
use serde::{de::Error as SerdeError, Deserialize, Deserializer};
use serde_json::Value;

pub mod address;
pub mod asset;
pub mod connect;
pub mod fee;
mod page;
pub mod staking;
pub mod transaction;
pub mod vault;
pub mod wallet;

pub use address::*;
pub use asset::*;
pub use fee::*;
pub use page::*;
pub use staking::*;
pub use transaction::*;
pub use vault::*;
pub use wallet::*;

fn deserialize_option_empty_object<'de, T, D>(deserializer: D) -> Result<Option<T>, D::Error>
where
  T: Deserialize<'de>,
  D: Deserializer<'de>,
{
  let v: Result<Value, D::Error> = Deserialize::deserialize(deserializer);

  match v {
    Ok(Value::Object(ref map)) if map.is_empty() => Ok(None),
    Ok(Value::String(ref s)) if s.is_empty() => Ok(None),
    Ok(val) => T::deserialize(val).map(Some).map_err(SerdeError::custom),
    Err(_) => Ok(None), // Assume field is missing and return None
  }
}

fn deserialize_epoch_time<'de, D>(deserializer: D) -> Result<DateTime<Utc>, D::Error>
where
  D: Deserializer<'de>,
{
  let millis = i64::deserialize(deserializer)?;
  match Utc.timestamp_millis_opt(millis) {
    LocalResult::Single(dt) => Ok(dt),
    _ => Err(SerdeError::custom(format!("invalid timestamp {millis}"))),
  }
}
fn deserialize_str_i32<'de, D>(deserializer: D) -> Result<i32, D::Error>
where
  D: Deserializer<'de>,
{
  let s = String::deserialize(deserializer)?;
  i32::from_str(&s).map_err(SerdeError::custom)
}

fn deserialize_str_u64<'de, D>(deserializer: D) -> Result<u64, D::Error>
where
  D: Deserializer<'de>,
{
  let s = String::deserialize(deserializer)?;
  u64::from_str(&s).map_err(SerdeError::custom)
}

#[derive(Debug, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
#[allow(dead_code)]
pub struct PaginatedAssetWallet {
  pub asset_wallets: Vec<AssetResponse>,
  pub paging: Paging,
}