pub mod balances;
pub mod common;
pub mod configuration;
pub mod market_data;
pub mod orders;
pub mod trades;
use serde::Deserialize;
use common::Timestamp;
#[derive(Debug, Clone, PartialEq, Eq, Deserialize)]
#[serde(from = "RawPage<T>")]
pub struct Page<T> {
pub items: Vec<T>,
pub next_cursor: Option<String>,
pub timestamp: Timestamp,
}
#[derive(Deserialize)]
struct RawPage<T> {
data: Vec<T>,
metadata: RawPageMeta,
}
#[derive(Deserialize)]
struct RawPageMeta {
timestamp: Timestamp,
#[serde(default)]
next_cursor: Option<String>,
}
impl<T> From<RawPage<T>> for Page<T> {
fn from(raw: RawPage<T>) -> Self {
let next_cursor = raw.metadata.next_cursor.filter(|c| !c.is_empty());
Page {
items: raw.data,
next_cursor,
timestamp: raw.metadata.timestamp,
}
}
}
#[derive(Deserialize)]
pub(crate) struct Data<T> {
pub data: T,
}
#[derive(Deserialize)]
#[serde(untagged)]
pub(crate) enum OneOrMany<T> {
One(T),
Many(Vec<T>),
}
impl<T> OneOrMany<T> {
pub(crate) fn into_first(self) -> Option<T> {
match self {
OneOrMany::One(value) => Some(value),
OneOrMany::Many(values) => values.into_iter().next(),
}
}
}