diff --git a/src/exchange/exchange_client.rs b/src/exchange/exchange_client.rs index fd1fb703..2dfb0763 100644 --- a/src/exchange/exchange_client.rs +++ b/src/exchange/exchange_client.rs @@ -106,10 +106,24 @@ impl ExchangeClient { meta: Option, vault_address: Option
, ) -> Result { - let client = client.unwrap_or_default(); let base_url = base_url.unwrap_or(BaseUrl::Mainnet); + let is_mainnet = base_url.is_mainnet(); + let base_url = base_url.get_url(); + Self::with_custom_url(client, wallet, base_url, is_mainnet, meta, vault_address).await + } + + pub async fn with_custom_url( + client: Option, + wallet: PrivateKeySigner, + base_url: String, + is_mainnet: bool, + meta: Option, + vault_address: Option
, + ) -> Result { + let client = client.unwrap_or_default(); + + let info = InfoClient::with_custom_url(None, base_url.clone(), is_mainnet, false).await?; - let info = InfoClient::new(None, Some(base_url)).await?; let meta = if let Some(meta) = meta { meta } else { @@ -132,7 +146,8 @@ impl ExchangeClient { vault_address, http_client: HttpClient { client, - base_url: base_url.get_url(), + base_url, + is_mainnet, }, coin_to_asset, }) diff --git a/src/helpers.rs b/src/helpers.rs index c642af7e..e49a66f2 100644 --- a/src/helpers.rs +++ b/src/helpers.rs @@ -85,6 +85,14 @@ impl BaseUrl { BaseUrl::Testnet => TESTNET_API_URL.to_string(), } } + + pub(crate) fn is_mainnet(&self) -> bool { + match self { + BaseUrl::Mainnet => true, + BaseUrl::Testnet => false, + BaseUrl::Localhost => false, + } + } } lazy_static! { diff --git a/src/info/info_client.rs b/src/info/info_client.rs index 4b109f97..e3ed273b 100644 --- a/src/info/info_client.rs +++ b/src/info/info_client.rs @@ -7,8 +7,9 @@ use tokio::sync::mpsc::UnboundedSender; use crate::{ info::{ - CandlesSnapshotResponse, FundingHistoryResponse, L2SnapshotResponse, OpenOrdersResponse, - OrderInfo, RecentTradesResponse, UserFillsResponse, UserStateResponse, ActiveAssetDataResponse, + ActiveAssetDataResponse, CandlesSnapshotResponse, FundingHistoryResponse, + L2SnapshotResponse, OpenOrdersResponse, OrderInfo, RecentTradesResponse, UserFillsResponse, + UserStateResponse, }, meta::{AssetContext, Meta, SpotMeta, SpotMetaAndAssetCtxs}, prelude::*, @@ -104,26 +105,41 @@ pub struct InfoClient { impl InfoClient { pub async fn new(client: Option, base_url: Option) -> Result { - Self::new_internal(client, base_url, false).await + Self::with_base_url(client, base_url, false).await } pub async fn with_reconnect( client: Option, base_url: Option, ) -> Result { - Self::new_internal(client, base_url, true).await + Self::with_base_url(client, base_url, true).await } - async fn new_internal( + async fn with_base_url( client: Option, base_url: Option, reconnect: bool, + ) -> Result { + let base_url = base_url.unwrap_or(BaseUrl::Mainnet); + let is_mainnet = base_url.is_mainnet(); + let base_url = base_url.get_url(); + Self::with_custom_url(client, base_url, is_mainnet, reconnect).await + } + + pub async fn with_custom_url( + client: Option, + base_url: String, + is_mainnet: bool, + reconnect: bool, ) -> Result { let client = client.unwrap_or_default(); - let base_url = base_url.unwrap_or(BaseUrl::Mainnet).get_url(); Ok(InfoClient { - http_client: HttpClient { client, base_url }, + http_client: HttpClient { + client, + base_url, + is_mainnet, + }, ws_manager: None, reconnect, }) @@ -311,7 +327,11 @@ impl InfoClient { self.send_info_request(input).await } - pub async fn active_asset_data(&self, user: Address, coin: String) -> Result { + pub async fn active_asset_data( + &self, + user: Address, + coin: String, + ) -> Result { let input = InfoRequest::ActiveAssetData { user, coin }; self.send_info_request(input).await } diff --git a/src/req.rs b/src/req.rs index f7d5e430..2ced7917 100644 --- a/src/req.rs +++ b/src/req.rs @@ -1,7 +1,7 @@ use reqwest::{Client, Response}; use serde::Deserialize; -use crate::{prelude::*, BaseUrl, Error}; +use crate::{prelude::*, Error}; #[derive(Deserialize, Debug)] struct ErrorData { @@ -14,6 +14,7 @@ struct ErrorData { pub struct HttpClient { pub client: Client, pub base_url: String, + pub is_mainnet: bool, } async fn parse_response(response: Response) -> Result { @@ -70,6 +71,6 @@ impl HttpClient { } pub fn is_mainnet(&self) -> bool { - self.base_url == BaseUrl::Mainnet.get_url() + self.is_mainnet } }