shuttle-sdk 0.1.0

Stellar Horizon Server client.
Documentation
use serde::{Deserialize, Deserializer};
use serde::de::DeserializeOwned;
use link::Link;

// lift "records" up: see https://github.com/serde-rs/serde/issues/868

#[derive(Debug, Clone, Deserialize)]
pub struct PaginatedResponse<T: DeserializeOwned> {
    #[serde(rename = "_links")] pub links: PageLinks,
    #[serde(rename = "_embedded", deserialize_with = "nested_embeded_records")] pub records: Vec<T>,
}

impl<T: DeserializeOwned> PaginatedResponse<T> {
    pub fn next(&self) -> &Link {
        &self.links.next
    }

    pub fn prev(&self) -> &Link {
        &self.links.prev
    }

    pub fn self_(&self) -> &Link {
        &self.links.self_
    }
}

#[derive(Debug, Clone, Deserialize)]
pub struct PageLinks {
    #[serde(rename = "self")] pub self_: Link,
    pub prev: Link,
    pub next: Link,
}

fn nested_embeded_records<'de, D, T>(deserializer: D) -> Result<Vec<T>, D::Error>
where
    D: Deserializer<'de>,
    T: DeserializeOwned,
{
    #[derive(Deserialize)]
    struct RecordsContainer<T> {
        records: Vec<T>,
    }
    RecordsContainer::deserialize(deserializer).map(|c| c.records)
}