use polyte_core::{QueryBuilder, Request};
use reqwest::Client;
use serde::{Deserialize, Serialize};
use url::Url;
use crate::error::DataApiError;
#[derive(Clone)]
pub struct BuildersApi {
pub(crate) client: Client,
pub(crate) base_url: Url,
}
impl BuildersApi {
pub fn leaderboard(&self) -> GetBuilderLeaderboard {
let request = Request::new(
self.client.clone(),
self.base_url.clone(),
"/v1/builders/leaderboard",
);
GetBuilderLeaderboard { request }
}
pub fn volume(&self) -> GetBuilderVolume {
let request = Request::new(
self.client.clone(),
self.base_url.clone(),
"/v1/builders/volume",
);
GetBuilderVolume { request }
}
}
pub struct GetBuilderLeaderboard {
request: Request<Vec<BuilderRanking>, DataApiError>,
}
impl GetBuilderLeaderboard {
pub fn time_period(mut self, period: TimePeriod) -> Self {
self.request = self.request.query("timePeriod", period);
self
}
pub fn limit(mut self, limit: u32) -> Self {
self.request = self.request.query("limit", limit);
self
}
pub fn offset(mut self, offset: u32) -> Self {
self.request = self.request.query("offset", offset);
self
}
pub async fn send(self) -> Result<Vec<BuilderRanking>, DataApiError> {
self.request.send().await
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
#[serde(rename_all = "UPPERCASE")]
pub enum TimePeriod {
#[default]
Day,
Week,
Month,
All,
}
impl std::fmt::Display for TimePeriod {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Day => write!(f, "DAY"),
Self::Week => write!(f, "WEEK"),
Self::Month => write!(f, "MONTH"),
Self::All => write!(f, "ALL"),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all(deserialize = "camelCase"))]
pub struct BuilderRanking {
pub rank: String,
pub builder: String,
pub volume: f64,
pub active_users: u64,
pub verified: bool,
pub builder_logo: Option<String>,
}
pub struct GetBuilderVolume {
request: Request<Vec<BuilderVolume>, DataApiError>,
}
impl GetBuilderVolume {
pub fn time_period(mut self, period: TimePeriod) -> Self {
self.request = self.request.query("timePeriod", period);
self
}
pub async fn send(self) -> Result<Vec<BuilderVolume>, DataApiError> {
self.request.send().await
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all(deserialize = "camelCase"))]
pub struct BuilderVolume {
pub dt: String,
pub builder: String,
pub builder_logo: Option<String>,
pub verified: bool,
pub volume: f64,
pub active_users: u64,
pub rank: String,
}