use std::sync::Arc;
use std::time::Duration;
use arc_swap::ArcSwap;
use super::Client;
use super::ClientApiError;
use super::ClientConfig;
use super::ClientInner;
use super::ConnectionPool;
use super::GrpcClient;
pub struct ClientBuilder {
config: ClientConfig,
endpoints: Vec<String>,
}
impl ClientBuilder {
pub fn new(endpoints: Vec<String>) -> Self {
Self {
config: ClientConfig::default(),
endpoints,
}
}
pub fn connect_timeout(
mut self,
timeout: Duration,
) -> Self {
self.config.connect_timeout = timeout;
self
}
pub fn request_timeout(
mut self,
timeout: Duration,
) -> Self {
self.config.request_timeout = timeout;
self
}
pub fn cluster_ready_timeout(
mut self,
timeout: Duration,
) -> Self {
self.config.cluster_ready_timeout = timeout;
self
}
pub fn enable_compression(
mut self,
enable: bool,
) -> Self {
self.config.enable_compression = enable;
self
}
pub fn set_config(
mut self,
config: ClientConfig,
) -> Self {
self.config = config;
self
}
pub async fn build(self) -> std::result::Result<Client, ClientApiError> {
let pool = ConnectionPool::create(self.endpoints.clone(), self.config.clone()).await?;
let client_inner = Arc::new(ArcSwap::from_pointee(ClientInner {
pool,
client_id: self.config.id,
config: self.config,
endpoints: self.endpoints,
}));
Ok(Client {
inner: Arc::new(GrpcClient::new(client_inner)),
})
}
}