use polyoxide_core::{HttpClient, QueryBuilder, Request};
use crate::{
error::GammaError,
types::{SportMetadata, Team},
};
#[derive(Clone)]
pub struct Sports {
pub(crate) http_client: HttpClient,
}
impl Sports {
pub fn list(&self) -> Request<Vec<SportMetadata>, GammaError> {
Request::new(self.http_client.clone(), "/sports")
}
pub fn market_types(&self) -> Request<serde_json::Value, GammaError> {
Request::new(self.http_client.clone(), "/sports/market-types")
}
pub fn list_teams(&self) -> ListTeams {
ListTeams {
request: Request::new(self.http_client.clone(), "/teams"),
}
}
}
pub struct ListTeams {
request: Request<Vec<Team>, GammaError>,
}
impl ListTeams {
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 fn order(mut self, order: impl Into<String>) -> Self {
self.request = self.request.query("order", order.into());
self
}
pub fn ascending(mut self, ascending: bool) -> Self {
self.request = self.request.query("ascending", ascending);
self
}
pub fn league(mut self, leagues: impl IntoIterator<Item = impl ToString>) -> Self {
self.request = self.request.query_many("league", leagues);
self
}
pub fn name(mut self, names: impl IntoIterator<Item = impl ToString>) -> Self {
self.request = self.request.query_many("name", names);
self
}
pub fn abbreviation(mut self, abbreviations: impl IntoIterator<Item = impl ToString>) -> Self {
self.request = self.request.query_many("abbreviation", abbreviations);
self
}
pub async fn send(self) -> Result<Vec<Team>, GammaError> {
self.request.send().await
}
}