#[cfg(feature = "clob")]
pub use polyoxide_clob;
#[cfg(feature = "data")]
pub use polyoxide_data;
#[cfg(feature = "gamma")]
pub use polyoxide_gamma;
#[cfg(all(feature = "clob", feature = "gamma", feature = "data"))]
use polyoxide_clob::{Account, Chain, Clob, ClobBuilder};
#[cfg(all(feature = "clob", feature = "gamma", feature = "data"))]
use polyoxide_data::{DataApi, DataApiBuilder};
#[cfg(all(feature = "clob", feature = "gamma", feature = "data"))]
use polyoxide_gamma::Gamma;
pub mod prelude {
#[cfg(feature = "ws")]
pub use polyoxide_clob::ws;
#[cfg(feature = "clob")]
pub use polyoxide_clob::{
Account, Chain, Clob, ClobBuilder, ClobError, CreateOrderParams, Credentials, OrderKind,
OrderSide, SignatureType,
};
#[cfg(feature = "data")]
pub use polyoxide_data::{DataApi, DataApiError};
#[cfg(feature = "gamma")]
pub use polyoxide_gamma::{Gamma, GammaError};
#[cfg(all(feature = "clob", feature = "gamma", feature = "data"))]
pub use crate::{Polymarket, PolymarketBuilder, PolymarketError};
}
#[derive(Debug, thiserror::Error)]
pub enum PolymarketError {
#[cfg(feature = "clob")]
#[error("CLOB error: {0}")]
Clob(#[from] polyoxide_clob::ClobError),
#[cfg(feature = "data")]
#[error("Data error: {0}")]
Data(#[from] polyoxide_data::DataApiError),
#[cfg(feature = "gamma")]
#[error("Gamma error: {0}")]
Gamma(#[from] polyoxide_gamma::GammaError),
#[error("Configuration error: {0}")]
Config(String),
}
#[cfg(all(feature = "clob", feature = "gamma", feature = "data"))]
#[derive(Clone)]
pub struct Polymarket {
pub clob: Clob,
pub gamma: Gamma,
pub data: DataApi,
}
#[cfg(all(feature = "clob", feature = "gamma", feature = "data"))]
impl Polymarket {
pub fn new(account: Account) -> Result<Self, PolymarketError> {
PolymarketBuilder::new(account).build()
}
pub fn builder(account: Account) -> PolymarketBuilder {
PolymarketBuilder::new(account)
}
}
#[cfg(all(feature = "clob", feature = "gamma", feature = "data"))]
pub struct PolymarketBuilder {
clob_base_url: Option<String>,
gamma_base_url: Option<String>,
data_base_url: Option<String>,
timeout_ms: Option<u64>,
chain: Option<Chain>,
account: Account,
}
#[cfg(all(feature = "clob", feature = "gamma", feature = "data"))]
impl PolymarketBuilder {
fn new(account: Account) -> Self {
Self {
clob_base_url: None,
gamma_base_url: None,
data_base_url: None,
timeout_ms: None,
chain: None,
account,
}
}
pub fn clob_base_url(mut self, url: impl Into<String>) -> Self {
self.clob_base_url = Some(url.into());
self
}
pub fn gamma_base_url(mut self, url: impl Into<String>) -> Self {
self.gamma_base_url = Some(url.into());
self
}
pub fn data_base_url(mut self, url: impl Into<String>) -> Self {
self.data_base_url = Some(url.into());
self
}
pub fn timeout_ms(mut self, timeout: u64) -> Self {
self.timeout_ms = Some(timeout);
self
}
pub fn chain(mut self, chain: Chain) -> Self {
self.chain = Some(chain);
self
}
pub fn build(self) -> Result<Polymarket, PolymarketError> {
let mut gamma_builder = Gamma::builder();
if let Some(url) = self.gamma_base_url {
gamma_builder = gamma_builder.base_url(url);
}
if let Some(timeout) = self.timeout_ms {
gamma_builder = gamma_builder.timeout_ms(timeout);
}
let gamma = gamma_builder.build()?;
let mut clob_builder = ClobBuilder::new().with_account(self.account);
if let Some(url) = self.clob_base_url {
clob_builder = clob_builder.base_url(url);
}
if let Some(timeout) = self.timeout_ms {
clob_builder = clob_builder.timeout_ms(timeout);
}
if let Some(chain) = self.chain {
clob_builder = clob_builder.chain(chain);
}
let clob = clob_builder.build()?;
let mut data_builder = DataApiBuilder::default();
if let Some(url) = self.data_base_url {
data_builder = data_builder.base_url(url);
}
if let Some(timeout) = self.timeout_ms {
data_builder = data_builder.timeout_ms(timeout);
}
let data = data_builder.build()?;
Ok(Polymarket { clob, gamma, data })
}
}