use std::sync::Arc;
use reqwest::Client as HttpClient;
use crate::config::Config;
use crate::error::{Error, Result};
use crate::http::BaseClient;
use crate::services::{
CommonService, DeliveryService, MarketService, MemberService, NewsService, SettleService,
TradeService,
};
use crate::token::TokenManager;
#[derive(Debug, Clone)]
pub struct Client {
config: Arc<Config>,
token_manager: Arc<TokenManager>,
pub news: NewsService,
pub common: CommonService,
pub market: MarketService,
pub delivery: DeliveryService,
pub member: MemberService,
pub trade: TradeService,
pub settle: SettleService,
}
impl Client {
pub fn new(mut config: Config) -> Result<Self> {
config.apply_defaults();
config.validate()?;
let http_client = HttpClient::builder()
.timeout(config.timeout)
.gzip(true)
.brotli(true)
.deflate(true)
.build()
.map_err(|e| {
Error::validation(
"http_client",
format!("failed to create HTTP client: {}", e),
)
})?;
let token_manager = Arc::new(TokenManager::new(
&config.api_key,
&config.secret,
&config.base_url,
http_client.clone(),
));
let base_client = BaseClient::new(config.clone(), http_client, token_manager.clone());
Ok(Client {
config: Arc::new(config),
token_manager,
news: NewsService::new(base_client.clone()),
common: CommonService::new(base_client.clone()),
market: MarketService::new(base_client.clone()),
delivery: DeliveryService::new(base_client.clone()),
member: MemberService::new(base_client.clone()),
trade: TradeService::new(base_client.clone()),
settle: SettleService::new(base_client),
})
}
pub fn from_env() -> Result<Self> {
let config = Config::from_env();
Self::new(config)
}
pub fn config(&self) -> &Config {
&self.config
}
pub fn token_manager(&self) -> &TokenManager {
&self.token_manager
}
}