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 fn get_team(&self, id: impl Into<String>) -> Request<Team, GammaError> {
Request::new(
self.http_client.clone(),
format!("/teams/{}", urlencoding::encode(&id.into())),
)
}
}
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
}
}
#[cfg(test)]
mod tests {
use crate::Gamma;
fn gamma() -> Gamma {
Gamma::new().unwrap()
}
#[test]
fn test_get_team_accepts_str_and_string() {
let _r1 = gamma().sports().get_team("12345");
let _r2 = gamma().sports().get_team(String::from("12345"));
}
}