shuttle-sdk 0.1.0

Stellar Horizon Server client.
Documentation
use std::convert::Into;
use std::collections::HashMap;
use shuttle_core::PublicKey;
use error::Result;
use client::{self, InnerClient};
use link::Link;
use pagination::PaginatedResponse;

/// Entry point for assets requests.
#[derive(Debug, Clone)]
pub struct AssetsRequest {
    inner: InnerClient,
}

impl AssetsRequest {
    /// Create a new `AssetsRequest`.
    pub fn new(inner: InnerClient) -> AssetsRequest {
        AssetsRequest { inner }
    }

    /// Filter by asset code.
    pub fn for_code<S: Into<String>>(self, code: S) -> AssetsForCodeRequest {
        let code = code.into();
        AssetsForCodeRequest::new(self.inner, code)
    }

    /// Filter by issuer.
    pub fn for_issuer(self, issuer: &PublicKey) -> Result<AssetsForIssuerRequest> {
        AssetsForIssuerRequest::new(self.inner, &issuer)
    }

    /// Send request to the server.
    pub fn send(&self) -> Result<PaginatedResponse<AssetRecord>> {
        client::parse_response(&mut self.inner.get(&["assets"])?.send()?)
    }
}

/// Request assets filtered by code.
#[derive(Debug, Clone)]
pub struct AssetsForCodeRequest {
    inner: InnerClient,
    code: String,
}

impl AssetsForCodeRequest {
    /// Create a new `'AssetsForCodeRequest`.
    pub fn new(inner: InnerClient, code: String) -> AssetsForCodeRequest {
        AssetsForCodeRequest { inner, code }
    }

    /// Send request to the server.
    pub fn send(&self) -> Result<PaginatedResponse<AssetRecord>> {
        client::parse_response(&mut self.inner
            .get(&["assets"])?
            .query(&[("asset_code", &self.code)])
            .send()?)
    }
}

/// Request assets filtered by issuer.
#[derive(Debug, Clone)]
pub struct AssetsForIssuerRequest {
    inner: InnerClient,
    issuer: String,
}

impl AssetsForIssuerRequest {
    /// Create a new `AssetsForIssuer`.
    pub fn new(inner: InnerClient, issuer: &PublicKey) -> Result<AssetsForIssuerRequest> {
        Ok(AssetsForIssuerRequest {
            inner,
            issuer: issuer.account_id()?,
        })
    }

    /// Send request to the server.
    pub fn send(&self) -> Result<PaginatedResponse<AssetRecord>> {
        client::parse_response(&mut self.inner
            .get(&["assets"])?
            .query(&[("asset_issuer", &self.issuer)])
            .send()?)
    }
}

/// Details about an asset.
#[derive(Debug, Clone, Deserialize)]
pub struct AssetRecord {
    #[serde(rename = "_links")] links: AssetRecordLinks,
    pub asset_type: String,
    pub asset_code: String,
    pub asset_issuer: String,
    pub paging_token: String,
    pub amount: String,
    pub num_accounts: u64,
    pub flags: HashMap<String, bool>,
}

/// Links of an `AssetRecord`.
#[derive(Debug, Clone, Deserialize)]
pub struct AssetRecordLinks {
    pub toml: Link,
}