polyte_data/api/
holders.rs1use reqwest::Client;
2use serde::{Deserialize, Serialize};
3use url::Url;
4
5use crate::request::{QueryBuilder, Request};
6
7#[derive(Clone)]
9pub struct Holders {
10 pub(crate) client: Client,
11 pub(crate) base_url: Url,
12}
13
14impl Holders {
15 pub fn list(&self, markets: impl IntoIterator<Item = impl ToString>) -> ListHolders {
17 let market_ids: Vec<String> = markets.into_iter().map(|s| s.to_string()).collect();
18 let mut request = Request::new(
19 self.client.clone(),
20 self.base_url.clone(),
21 "/holders".to_string(),
22 );
23 if !market_ids.is_empty() {
24 request = request.query("market", market_ids.join(","));
25 }
26
27 ListHolders { request }
28 }
29}
30
31pub struct ListHolders {
33 request: Request<Vec<MarketHolders>>,
34}
35
36impl ListHolders {
37 pub fn limit(mut self, limit: u32) -> Self {
39 self.request = self.request.query("limit", limit);
40 self
41 }
42
43 pub fn min_balance(mut self, min_balance: u32) -> Self {
45 self.request = self.request.query("minBalance", min_balance);
46 self
47 }
48
49 pub async fn send(self) -> crate::error::Result<Vec<MarketHolders>> {
51 self.request.send().await
52 }
53}
54
55#[derive(Debug, Clone, Serialize, Deserialize)]
57#[serde(rename_all(deserialize = "camelCase"))]
58pub struct MarketHolders {
59 pub token: String,
61 pub holders: Vec<Holder>,
63}
64
65#[derive(Debug, Clone, Serialize, Deserialize)]
67#[serde(rename_all(deserialize = "camelCase"))]
68pub struct Holder {
69 pub proxy_wallet: String,
71 pub bio: Option<String>,
73 pub asset: Option<String>,
75 pub pseudonym: Option<String>,
77 pub amount: f64,
79 pub display_username_public: Option<bool>,
81 pub outcome_index: u32,
83 pub name: Option<String>,
85 pub profile_image: Option<String>,
87 pub profile_image_optimized: Option<String>,
89}