use shuttle_core::{Amount, PublicKey};
use error::Result;
use client::{self, InnerClient};
use link::Link;
use pagination::PaginatedResponse;
use deserialize;
#[derive(Debug, Clone)]
pub struct EffectsRequest {
inner: InnerClient,
}
impl EffectsRequest {
pub fn new(inner: InnerClient) -> EffectsRequest {
EffectsRequest { inner }
}
pub fn for_account(self, account_id: &PublicKey) -> Result<EffectsForAccountRequest> {
EffectsForAccountRequest::new(self.inner, &account_id)
}
pub fn send(&self) -> Result<PaginatedResponse<Effect>> {
client::parse_response(&mut self.inner.get(&["effects"])?.send()?)
}
}
#[derive(Debug, Clone)]
pub struct EffectsForAccountRequest {
inner: InnerClient,
account_id: String,
}
impl EffectsForAccountRequest {
pub fn new(inner: InnerClient, account_id: &PublicKey) -> Result<EffectsForAccountRequest> {
let account_id = account_id.account_id()?;
Ok(EffectsForAccountRequest { inner, account_id })
}
pub fn send(&self) -> Result<PaginatedResponse<Effect>> {
client::parse_response(&mut self.inner
.get(&["accounts", &self.account_id, "effects"])?
.send()?)
}
}
#[derive(Debug, Clone, Deserialize)]
#[serde(tag = "type")]
pub enum Effect {
#[serde(rename = "account_created")] AccountCreated(AccountCreatedEffect),
#[serde(rename = "account_removed")] AccountRemoved(AccountRemovedEffect),
#[serde(rename = "account_credited")] AccountCredited(AccountCreditedEffect),
#[serde(rename = "account_debited")] AccountDebited(AccountDebitedEffect),
#[serde(rename = "signer_created")] SignerCreated(SignerCreatedEffect),
}
#[derive(Debug, Clone, Deserialize)]
pub struct EffectLinks {
pub operation: Link,
pub succeeds: Link,
pub precedes: Link,
}
#[derive(Debug, Clone, Deserialize)]
pub struct AccountCreatedEffect {
#[serde(rename = "_links")] pub links: EffectLinks,
#[serde(deserialize_with = "deserialize::account_id")] pub account: PublicKey,
pub paging_token: String,
#[serde(deserialize_with = "deserialize::from_str")] pub starting_balance: Amount,
}
#[derive(Debug, Clone, Deserialize)]
pub struct AccountRemovedEffect {
#[serde(rename = "_links")] pub links: EffectLinks,
#[serde(deserialize_with = "deserialize::account_id")] pub account: PublicKey,
pub paging_token: String,
}
#[derive(Debug, Clone, Deserialize)]
pub struct AccountCreditedEffect {
#[serde(rename = "_links")] pub links: EffectLinks,
#[serde(deserialize_with = "deserialize::account_id")] pub account: PublicKey,
pub paging_token: String,
#[serde(deserialize_with = "deserialize::from_str")] pub amount: Amount,
}
#[derive(Debug, Clone, Deserialize)]
pub struct AccountDebitedEffect {
#[serde(rename = "_links")] pub links: EffectLinks,
#[serde(deserialize_with = "deserialize::account_id")] pub account: PublicKey,
pub paging_token: String,
}
#[derive(Debug, Clone, Deserialize)]
pub struct SignerCreatedEffect {
#[serde(rename = "_links")] pub links: EffectLinks,
#[serde(deserialize_with = "deserialize::account_id")] pub account: PublicKey,
pub paging_token: String,
}