use std::time::Duration;
use crate::error;
use crate::exchanges::{HyperliquidClient, LighterClient};
use crate::http::{HttpClient, HttpConfig};
use crate::resources::{DataQualityResource, Web3Resource};
pub const DEFAULT_BASE_URL: &str = "https://api.0xarchive.io";
pub const DEFAULT_TIMEOUT_SECS: u64 = 30;
pub struct ClientBuilder {
api_key: String,
base_url: String,
timeout: Duration,
}
impl ClientBuilder {
pub fn new(api_key: impl Into<String>) -> Self {
Self {
api_key: api_key.into(),
base_url: DEFAULT_BASE_URL.to_string(),
timeout: Duration::from_secs(DEFAULT_TIMEOUT_SECS),
}
}
pub fn base_url(mut self, url: impl Into<String>) -> Self {
self.base_url = url.into();
self
}
pub fn timeout(mut self, timeout: Duration) -> Self {
self.timeout = timeout;
self
}
pub fn build(self) -> error::Result<OxArchive> {
let http = HttpClient::new(HttpConfig {
base_url: self.base_url,
api_key: self.api_key,
timeout: self.timeout,
})?;
Ok(OxArchive {
hyperliquid: HyperliquidClient::new(http.clone()),
lighter: LighterClient::new(http.clone()),
data_quality: DataQualityResource::new(http.clone()),
web3: Web3Resource::new(http),
})
}
}
#[derive(Debug, Clone)]
pub struct OxArchive {
pub hyperliquid: HyperliquidClient,
pub lighter: LighterClient,
pub data_quality: DataQualityResource,
pub web3: Web3Resource,
}
impl OxArchive {
pub fn new(api_key: impl Into<String>) -> error::Result<Self> {
ClientBuilder::new(api_key).build()
}
pub fn builder(api_key: impl Into<String>) -> ClientBuilder {
ClientBuilder::new(api_key)
}
}