stonfi_api_client 0.9.0

API client for Stonfi
Documentation
mod request;
mod response;
mod types;

use api_clients_core::{ApiClientsResult, Executor};
use std::sync::Arc;

pub use request::*;
pub use response::*;
pub use types::*;

/// Executes typed requests against STON.fi public export feeds.
#[derive(Clone)]
pub struct ExportApiClient {
    executor: Arc<Executor>,
}

impl ExportApiClient {
    pub(crate) fn new(executor: Arc<Executor>) -> Self { Self { executor } }

    /// Execute an export-feed request and return its matching response variant.
    ///
    /// # Errors
    ///
    /// Returns an error when request serialization, transport, status handling,
    /// or response deserialization fails.
    pub async fn exec<REQUEST>(&self, request: REQUEST) -> ApiClientsResult<ExportResponse>
    where
        REQUEST: Into<ExportRequest>,
    {
        let request = request.into();
        let response = match &request {
            ExportRequest::Cmc => ExportResponse::Cmc(self.executor.exec_get("export/cmc/v1").await?),
            ExportRequest::DexscreenerLatestBlock => ExportResponse::DexscreenerLatestBlock(
                self.executor.exec_get("export/dexscreener/v1/latest-block").await?,
            ),
            ExportRequest::DexscreenerAsset(address) => ExportResponse::DexscreenerAsset(
                self.executor.exec_get(&format!("export/dexscreener/v1/asset/{address}")).await?,
            ),
            ExportRequest::DexscreenerPair(address) => ExportResponse::DexscreenerPair(
                self.executor.exec_get(&format!("export/dexscreener/v1/pair/{address}")).await?,
            ),
            ExportRequest::DexscreenerEvents(params) => ExportResponse::DexscreenerEvents(
                self.executor.exec_get_extra("export/dexscreener/v1/events", params, &[]).await?,
            ),
        };
        Ok(response)
    }
}