use std::env;
use std::time::Duration;
use crate::error::{Error, Result};
pub const DEFAULT_BASE_URL: &str = "http://www.dce.com.cn";
pub const DEFAULT_TIMEOUT_SECS: u64 = 30;
pub const DEFAULT_LANG: &str = "zh";
pub const DEFAULT_TRADE_TYPE: i32 = 1;
pub const ENV_API_KEY: &str = "DCE_API_KEY";
pub const ENV_SECRET: &str = "DCE_SECRET";
#[derive(Debug, Clone)]
pub struct Config {
pub base_url: String,
pub api_key: String,
pub secret: String,
pub timeout: Duration,
pub lang: String,
pub trade_type: i32,
}
impl Default for Config {
fn default() -> Self {
Self::new()
}
}
impl Config {
pub fn new() -> Self {
Config {
base_url: DEFAULT_BASE_URL.to_string(),
api_key: String::new(),
secret: String::new(),
timeout: Duration::from_secs(DEFAULT_TIMEOUT_SECS),
lang: DEFAULT_LANG.to_string(),
trade_type: DEFAULT_TRADE_TYPE,
}
}
pub fn from_env() -> Self {
let mut config = Self::new();
config.api_key = env::var(ENV_API_KEY).unwrap_or_default();
config.secret = env::var(ENV_SECRET).unwrap_or_default();
config
}
pub fn with_base_url(mut self, base_url: impl Into<String>) -> Self {
self.base_url = base_url.into();
self
}
pub fn with_api_key(mut self, api_key: impl Into<String>) -> Self {
self.api_key = api_key.into();
self
}
pub fn with_secret(mut self, secret: impl Into<String>) -> Self {
self.secret = secret.into();
self
}
pub fn with_timeout(mut self, timeout: Duration) -> Self {
self.timeout = timeout;
self
}
pub fn with_lang(mut self, lang: impl Into<String>) -> Self {
self.lang = lang.into();
self
}
pub fn with_trade_type(mut self, trade_type: i32) -> Self {
self.trade_type = trade_type;
self
}
pub fn validate(&self) -> Result<()> {
if self.api_key.is_empty() {
return Err(Error::validation("api_key", "API key is required"));
}
if self.secret.is_empty() {
return Err(Error::validation("secret", "secret is required"));
}
Ok(())
}
pub fn apply_defaults(&mut self) {
if self.base_url.is_empty() {
self.base_url = DEFAULT_BASE_URL.to_string();
}
if self.timeout.is_zero() {
self.timeout = Duration::from_secs(DEFAULT_TIMEOUT_SECS);
}
if self.lang.is_empty() {
self.lang = DEFAULT_LANG.to_string();
}
if self.trade_type == 0 {
self.trade_type = DEFAULT_TRADE_TYPE;
}
}
}