use polyte_core::{QueryBuilder, Request};
use reqwest::Client;
use serde::{Deserialize, Serialize};
use url::Url;
use crate::error::DataApiError;
#[derive(Clone)]
pub struct Holders {
pub(crate) client: Client,
pub(crate) base_url: Url,
}
impl Holders {
pub fn list(&self, markets: impl IntoIterator<Item = impl ToString>) -> ListHolders {
let market_ids: Vec<String> = markets.into_iter().map(|s| s.to_string()).collect();
let mut request = Request::new(self.client.clone(), self.base_url.clone(), "/holders");
if !market_ids.is_empty() {
request = request.query("market", market_ids.join(","));
}
ListHolders { request }
}
}
pub struct ListHolders {
request: Request<Vec<MarketHolders>, DataApiError>,
}
impl ListHolders {
pub fn limit(mut self, limit: u32) -> Self {
self.request = self.request.query("limit", limit);
self
}
pub fn min_balance(mut self, min_balance: u32) -> Self {
self.request = self.request.query("minBalance", min_balance);
self
}
pub async fn send(self) -> crate::error::Result<Vec<MarketHolders>> {
self.request.send().await
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all(deserialize = "camelCase"))]
pub struct MarketHolders {
pub token: String,
pub holders: Vec<Holder>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all(deserialize = "camelCase"))]
pub struct Holder {
pub proxy_wallet: String,
pub bio: Option<String>,
pub asset: Option<String>,
pub pseudonym: Option<String>,
pub amount: f64,
pub display_username_public: Option<bool>,
pub outcome_index: u32,
pub name: Option<String>,
pub profile_image: Option<String>,
pub profile_image_optimized: Option<String>,
}