pub const GAMMA_API_BASE: &str = "https://gamma-api.polymarket.com";
pub const DATA_API_BASE: &str = "https://data-api.polymarket.com";
pub const CLOB_API_BASE: &str = "https://clob.polymarket.com";
pub const PROFILES_API_BASE: &str = "https://polymarket.com/api";
pub const RELAYER_API_BASE: &str = "https://relayer-v2.polymarket.com";
pub const RTDS_WSS_BASE: &str = "wss://ws-live-data.polymarket.com";
pub const CLOB_WSS_BASE: &str = "wss://ws-subscriptions-clob.polymarket.com";
pub const ENV_GAMMA_URL: &str = "POLYMARKET_GAMMA_URL";
pub const ENV_DATA_URL: &str = "POLYMARKET_DATA_URL";
pub const ENV_CLOB_URL: &str = "POLYMARKET_CLOB_URL";
pub const ENV_PROFILES_URL: &str = "POLYMARKET_PROFILES_URL";
pub const ENV_RELAYER_URL: &str = "POLYMARKET_RELAYER_URL";
pub const ENV_RTDS_URL: &str = "POLYMARKET_RTDS_URL";
pub const ENV_WSS_URL: &str = "POLYMARKET_WSS_URL";
#[must_use]
pub fn gamma_api_url() -> String {
std::env::var(ENV_GAMMA_URL).unwrap_or_else(|_| GAMMA_API_BASE.to_string())
}
#[must_use]
pub fn data_api_url() -> String {
std::env::var(ENV_DATA_URL).unwrap_or_else(|_| DATA_API_BASE.to_string())
}
#[must_use]
pub fn clob_api_url() -> String {
std::env::var(ENV_CLOB_URL).unwrap_or_else(|_| CLOB_API_BASE.to_string())
}
#[must_use]
pub fn profiles_api_url() -> String {
std::env::var(ENV_PROFILES_URL).unwrap_or_else(|_| PROFILES_API_BASE.to_string())
}
#[must_use]
pub fn relayer_api_url() -> String {
std::env::var(ENV_RELAYER_URL).unwrap_or_else(|_| RELAYER_API_BASE.to_string())
}
#[must_use]
pub fn rtds_wss_url() -> String {
std::env::var(ENV_RTDS_URL).unwrap_or_else(|_| RTDS_WSS_BASE.to_string())
}
#[must_use]
pub fn clob_wss_url() -> String {
std::env::var(ENV_WSS_URL).unwrap_or_else(|_| CLOB_WSS_BASE.to_string())
}
#[derive(Debug, Clone)]
pub struct Endpoints {
pub gamma_api: String,
pub data_api: String,
pub clob_api: String,
pub profiles_api: String,
pub relayer_api: String,
pub rtds_wss: String,
pub clob_wss: String,
}
impl Default for Endpoints {
fn default() -> Self {
Self::new()
}
}
impl Endpoints {
#[must_use]
pub fn new() -> Self {
Self {
gamma_api: GAMMA_API_BASE.to_string(),
data_api: DATA_API_BASE.to_string(),
clob_api: CLOB_API_BASE.to_string(),
profiles_api: PROFILES_API_BASE.to_string(),
relayer_api: RELAYER_API_BASE.to_string(),
rtds_wss: RTDS_WSS_BASE.to_string(),
clob_wss: CLOB_WSS_BASE.to_string(),
}
}
#[must_use]
pub fn from_env() -> Self {
Self {
gamma_api: gamma_api_url(),
data_api: data_api_url(),
clob_api: clob_api_url(),
profiles_api: profiles_api_url(),
relayer_api: relayer_api_url(),
rtds_wss: rtds_wss_url(),
clob_wss: clob_wss_url(),
}
}
#[must_use]
pub fn with_gamma_api(mut self, url: impl Into<String>) -> Self {
self.gamma_api = url.into();
self
}
#[must_use]
pub fn with_data_api(mut self, url: impl Into<String>) -> Self {
self.data_api = url.into();
self
}
#[must_use]
pub fn with_clob_api(mut self, url: impl Into<String>) -> Self {
self.clob_api = url.into();
self
}
#[must_use]
pub fn with_profiles_api(mut self, url: impl Into<String>) -> Self {
self.profiles_api = url.into();
self
}
#[must_use]
pub fn with_relayer_api(mut self, url: impl Into<String>) -> Self {
self.relayer_api = url.into();
self
}
#[must_use]
pub fn with_rtds_wss(mut self, url: impl Into<String>) -> Self {
self.rtds_wss = url.into();
self
}
#[must_use]
pub fn with_clob_wss(mut self, url: impl Into<String>) -> Self {
self.clob_wss = url.into();
self
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_endpoints() {
let endpoints = Endpoints::new();
assert_eq!(endpoints.gamma_api, GAMMA_API_BASE);
assert_eq!(endpoints.data_api, DATA_API_BASE);
assert_eq!(endpoints.clob_api, CLOB_API_BASE);
assert_eq!(endpoints.profiles_api, PROFILES_API_BASE);
assert_eq!(endpoints.relayer_api, RELAYER_API_BASE);
assert_eq!(endpoints.rtds_wss, RTDS_WSS_BASE);
assert_eq!(endpoints.clob_wss, CLOB_WSS_BASE);
}
#[test]
fn test_builder_pattern() {
let endpoints = Endpoints::new()
.with_gamma_api("https://custom-gamma.example.com")
.with_data_api("https://custom-data.example.com");
assert_eq!(endpoints.gamma_api, "https://custom-gamma.example.com");
assert_eq!(endpoints.data_api, "https://custom-data.example.com");
assert_eq!(endpoints.clob_api, CLOB_API_BASE);
}
#[test]
fn test_constants() {
assert!(GAMMA_API_BASE.starts_with("https://"));
assert!(DATA_API_BASE.starts_with("https://"));
assert!(CLOB_API_BASE.starts_with("https://"));
assert!(PROFILES_API_BASE.starts_with("https://"));
assert!(RTDS_WSS_BASE.starts_with("wss://"));
assert!(CLOB_WSS_BASE.starts_with("wss://"));
}
}