polyte_data/api/
holders.rs1use polyte_core::{QueryBuilder, Request};
2use reqwest::Client;
3use serde::{Deserialize, Serialize};
4use url::Url;
5
6use crate::error::DataApiError;
7
8#[derive(Clone)]
10pub struct Holders {
11 pub(crate) client: Client,
12 pub(crate) base_url: Url,
13}
14
15impl Holders {
16 pub fn list(&self, markets: impl IntoIterator<Item = impl ToString>) -> ListHolders {
18 let market_ids: Vec<String> = markets.into_iter().map(|s| s.to_string()).collect();
19 let mut request = Request::new(self.client.clone(), self.base_url.clone(), "/holders");
20 if !market_ids.is_empty() {
21 request = request.query("market", market_ids.join(","));
22 }
23
24 ListHolders { request }
25 }
26}
27
28pub struct ListHolders {
30 request: Request<Vec<MarketHolders>, DataApiError>,
31}
32
33impl ListHolders {
34 pub fn limit(mut self, limit: u32) -> Self {
36 self.request = self.request.query("limit", limit);
37 self
38 }
39
40 pub fn min_balance(mut self, min_balance: u32) -> Self {
42 self.request = self.request.query("minBalance", min_balance);
43 self
44 }
45
46 pub async fn send(self) -> crate::error::Result<Vec<MarketHolders>> {
48 self.request.send().await
49 }
50}
51
52#[derive(Debug, Clone, Serialize, Deserialize)]
54#[serde(rename_all(deserialize = "camelCase"))]
55pub struct MarketHolders {
56 pub token: String,
58 pub holders: Vec<Holder>,
60}
61
62#[derive(Debug, Clone, Serialize, Deserialize)]
64#[serde(rename_all(deserialize = "camelCase"))]
65pub struct Holder {
66 pub proxy_wallet: String,
68 pub bio: Option<String>,
70 pub asset: Option<String>,
72 pub pseudonym: Option<String>,
74 pub amount: f64,
76 pub display_username_public: Option<bool>,
78 pub outcome_index: u32,
80 pub name: Option<String>,
82 pub profile_image: Option<String>,
84 pub profile_image_optimized: Option<String>,
86}