use std::time::Duration;
use flare_core::flare_net::net::Platform;
const PING_INTERVAL: Duration = Duration::from_secs(30);
const PONG_TIMEOUT: Duration = Duration::from_secs(10);
const RECONNECT_INTERVAL: Duration = Duration::from_secs(5);
const MAX_RECONNECT_ATTEMPTS: u32 = 5;
#[derive(Clone)]
pub struct ClientConfig {
pub ping_interval: Duration,
pub pong_timeout: Duration,
pub reconnect_interval: Duration,
pub max_reconnect_attempts: u32,
pub auth_token: String,
pub platform: Platform,
pub client_id: String,
pub user_id: String,
pub language: Option<String>,
}
impl Default for ClientConfig {
fn default() -> Self {
Self {
ping_interval: PING_INTERVAL,
pong_timeout: PONG_TIMEOUT,
reconnect_interval: RECONNECT_INTERVAL,
max_reconnect_attempts: MAX_RECONNECT_ATTEMPTS,
auth_token: String::new(),
platform: Platform::Web,
client_id: uuid::Uuid::new_v4().to_string(),
user_id: String::new(),
language: None,
}
}
}
pub struct ClientConfigBuilder {
config: ClientConfig,
}
impl ClientConfigBuilder {
pub fn new() -> Self {
Self {
config: ClientConfig::default(),
}
}
pub fn ping_interval(mut self, interval: Duration) -> Self {
self.config.ping_interval = interval;
self
}
pub fn pong_timeout(mut self, timeout: Duration) -> Self {
self.config.pong_timeout = timeout;
self
}
pub fn reconnect_interval(mut self, interval: Duration) -> Self {
self.config.reconnect_interval = interval;
self
}
pub fn max_reconnect_attempts(mut self, attempts: u32) -> Self {
self.config.max_reconnect_attempts = attempts;
self
}
pub fn auth_token(mut self, token: impl Into<String>) -> Self {
self.config.auth_token = token.into();
self
}
pub fn platform(mut self, platform: Platform) -> Self {
self.config.platform = platform;
self
}
pub fn client_id(mut self, client_id: impl Into<String>) -> Self {
self.config.client_id = client_id.into();
self
}
pub fn user_id(mut self, user_id: impl Into<String>) -> Self {
self.config.user_id = user_id.into();
self
}
pub fn language(mut self, language: impl Into<String>) -> Self {
self.config.language = Some(language.into());
self
}
pub fn build(self) -> ClientConfig {
self.config
}
}
impl Default for ClientConfigBuilder {
fn default() -> Self {
Self::new()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_client_config_builder() {
let config = ClientConfigBuilder::new()
.ping_interval(Duration::from_secs(60))
.pong_timeout(Duration::from_secs(20))
.reconnect_interval(Duration::from_secs(10))
.max_reconnect_attempts(3)
.auth_token("test_token")
.platform(Platform::Web)
.client_id("test_client")
.user_id("test_user")
.language("zh-CN")
.build();
assert_eq!(config.ping_interval, Duration::from_secs(60));
assert_eq!(config.pong_timeout, Duration::from_secs(20));
assert_eq!(config.reconnect_interval, Duration::from_secs(10));
assert_eq!(config.max_reconnect_attempts, 3);
assert_eq!(config.auth_token, "test_token");
assert_eq!(config.platform, Platform::Web);
assert_eq!(config.client_id, "test_client");
assert_eq!(config.user_id, "test_user");
assert_eq!(config.language, Some("zh-CN".to_string()));
}
#[test]
fn test_client_config_default() {
let config = ClientConfig::default();
assert_eq!(config.ping_interval, PING_INTERVAL);
assert_eq!(config.pong_timeout, PONG_TIMEOUT);
assert_eq!(config.reconnect_interval, RECONNECT_INTERVAL);
assert_eq!(config.max_reconnect_attempts, MAX_RECONNECT_ATTEMPTS);
assert!(config.auth_token.is_empty());
assert_eq!(config.platform, Platform::Unknown);
assert!(!config.client_id.is_empty());
assert!(config.user_id.is_empty());
assert_eq!(config.language, None);
}
}