use crate::{constants, models};
use strum_macros::Display;
use super::CieloApi;
#[derive(Debug, Clone, Default)]
pub struct Filters {
pub wallet: Option<String>,
pub limit: Option<u32>,
pub list_id: Option<u64>,
pub chains: Option<Vec<String>>,
pub tx_types: Option<Vec<TxType>>,
pub tokens: Option<Vec<String>>,
pub min_usd: Option<u64>,
pub new_trades: Option<bool>,
pub start_from: Option<String>,
pub from_timestamp: Option<u64>,
pub to_timestamp: Option<u64>,
pub include_market_cap: Option<bool>,
}
#[derive(Display, Debug, Clone)]
#[strum(serialize_all = "snake_case")]
pub enum TxType {
Bridge,
ContractCreation,
ContractInteraction,
Flashloan,
Lending,
Lp,
NftLending,
NftLiquidation,
NftMint,
NftSweep,
NftTrade,
NftTransfer,
Option,
Perp,
Reward,
Staking,
SudoPool,
Swap,
Transfer,
Wrap,
}
impl CieloApi {
pub async fn get_feed(
&self,
filters: Filters,
) -> Result<Vec<models::feed::Item>, crate::Error> {
let url = format!("{}feed", constants::URL);
let mut request = self.client.get(url);
if let Some(wallet) = filters.wallet {
request = request.query(&[("wallet", wallet)]);
}
if let Some(limit) = filters.limit {
request = request.query(&[("limit", limit.to_string())]);
}
if let Some(list_id) = filters.list_id {
request = request.query(&[("list", list_id.to_string())]);
}
if let Some(chains) = filters.chains {
request = request.query(&[("chains", chains.join(","))]);
}
if let Some(tx_types) = filters.tx_types {
let tx_types_str: Vec<String> = tx_types.iter().map(|tx| tx.to_string()).collect();
request = request.query(&[("txTypes", tx_types_str.join(","))]);
}
if let Some(tokens) = filters.tokens {
request = request.query(&[("tokens", tokens.join(","))]);
}
if let Some(min_usd) = filters.min_usd {
request = request.query(&[("minUSD", min_usd.to_string())]);
}
if let Some(new_trades) = filters.new_trades {
request = request.query(&[("newTrades", new_trades.to_string())]);
}
if let Some(start_from) = filters.start_from {
request = request.query(&[("startFrom", start_from)]);
}
if let Some(from_timestamp) = filters.from_timestamp {
request = request.query(&[("fromTimestamp", from_timestamp.to_string())]);
}
if let Some(to_timestamp) = filters.to_timestamp {
request = request.query(&[("toTimestamp", to_timestamp.to_string())]);
}
let response = request.send().await?;
if !response.status().is_success() {
return Err(crate::Error::StatusNot200(response.text().await?));
}
let response_items = response
.json::<models::Response<models::feed::Item>>()
.await?
.data
.items;
Ok(response_items)
}
}