use std::time::Duration;
use reqwest::Client;
use url::Url;
use crate::{
api::{
comments::Comments, events::Events, markets::Markets, series::Series, sports::Sports,
tags::Tags,
},
error::Result,
};
const DEFAULT_BASE_URL: &str = "https://gamma-api.polymarket.com";
const DEFAULT_TIMEOUT_MS: u64 = 30_000;
const DEFAULT_POOL_SIZE: usize = 10;
#[derive(Clone)]
pub struct Gamma {
pub(crate) client: Client,
pub(crate) base_url: Url,
}
impl Gamma {
pub fn new() -> Result<Self> {
Self::builder().build()
}
pub fn builder() -> GammaBuilder {
GammaBuilder::new()
}
pub fn markets(&self) -> Markets {
Markets {
client: self.client.clone(),
base_url: self.base_url.clone(),
}
}
pub fn events(&self) -> Events {
Events {
client: self.client.clone(),
base_url: self.base_url.clone(),
}
}
pub fn series(&self) -> Series {
Series {
client: self.client.clone(),
base_url: self.base_url.clone(),
}
}
pub fn tags(&self) -> Tags {
Tags {
client: self.client.clone(),
base_url: self.base_url.clone(),
}
}
pub fn sports(&self) -> Sports {
Sports {
client: self.client.clone(),
base_url: self.base_url.clone(),
}
}
pub fn comments(&self) -> Comments {
Comments {
client: self.client.clone(),
base_url: self.base_url.clone(),
}
}
}
pub struct GammaBuilder {
base_url: String,
timeout_ms: u64,
pool_size: usize,
}
impl GammaBuilder {
fn new() -> Self {
Self {
base_url: DEFAULT_BASE_URL.to_string(),
timeout_ms: DEFAULT_TIMEOUT_MS,
pool_size: DEFAULT_POOL_SIZE,
}
}
pub fn base_url(mut self, url: impl Into<String>) -> Self {
self.base_url = url.into();
self
}
pub fn timeout_ms(mut self, timeout: u64) -> Self {
self.timeout_ms = timeout;
self
}
pub fn pool_size(mut self, size: usize) -> Self {
self.pool_size = size;
self
}
pub fn build(self) -> Result<Gamma> {
let client = Client::builder()
.timeout(Duration::from_millis(self.timeout_ms))
.pool_max_idle_per_host(self.pool_size)
.build()?;
let base_url = Url::parse(&self.base_url)?;
Ok(Gamma { client, base_url })
}
}
impl Default for GammaBuilder {
fn default() -> Self {
Self::new()
}
}