use std::time::Duration;
use crate::{Qdrant, QdrantError};
#[derive(Clone)]
pub struct QdrantConfig {
pub uri: String,
pub timeout: Duration,
pub connect_timeout: Duration,
pub keep_alive_while_idle: bool,
pub api_key: Option<String>,
pub compression: Option<CompressionEncoding>,
pub check_compatibility: bool,
pub pool_size: usize,
}
impl QdrantConfig {
pub fn from_url(url: &str) -> Self {
QdrantConfig {
uri: url.to_string(),
..Self::default()
}
}
pub fn api_key(mut self, api_key: impl AsOptionApiKey) -> Self {
self.api_key = api_key.api_key();
self
}
pub fn keep_alive_while_idle(mut self) -> Self {
self.keep_alive_while_idle = true;
self
}
pub fn timeout(mut self, timeout: impl AsTimeout) -> Self {
self.timeout = timeout.timeout();
self
}
pub fn connect_timeout(mut self, timeout: impl AsTimeout) -> Self {
self.connect_timeout = timeout.timeout();
self
}
pub fn compression(mut self, compression: Option<CompressionEncoding>) -> Self {
self.compression = compression;
self
}
pub fn set_api_key(&mut self, api_key: &str) {
self.api_key = Some(api_key.to_string());
}
pub fn set_timeout(&mut self, timeout: Duration) {
self.timeout = timeout;
}
pub fn set_connect_timeout(&mut self, connect_timeout: Duration) {
self.connect_timeout = connect_timeout;
}
pub fn set_keep_alive_while_idle(&mut self, keep_alive_while_idle: bool) {
self.keep_alive_while_idle = keep_alive_while_idle;
}
pub fn set_compression(&mut self, compression: Option<CompressionEncoding>) {
self.compression = compression;
}
pub fn build(self) -> Result<Qdrant, QdrantError> {
Qdrant::new(self)
}
pub fn skip_compatibility_check(mut self) -> Self {
self.check_compatibility = false;
self
}
pub fn set_pool_size(&mut self, pool_size: usize) {
self.pool_size = pool_size;
}
}
impl Default for QdrantConfig {
fn default() -> Self {
Self {
uri: String::from("http://localhost:6334"),
timeout: Duration::from_secs(5),
connect_timeout: Duration::from_secs(5),
keep_alive_while_idle: true,
api_key: None,
compression: None,
check_compatibility: true,
pool_size: 3,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CompressionEncoding {
Gzip,
}
impl From<CompressionEncoding> for tonic::codec::CompressionEncoding {
fn from(encoding: CompressionEncoding) -> Self {
match encoding {
CompressionEncoding::Gzip => tonic::codec::CompressionEncoding::Gzip,
}
}
}
pub trait AsTimeout {
fn timeout(self) -> Duration;
}
impl AsTimeout for Duration {
fn timeout(self) -> Duration {
self
}
}
impl AsTimeout for u64 {
fn timeout(self) -> Duration {
Duration::from_secs(self)
}
}
pub trait AsOptionApiKey {
fn api_key(self) -> Option<String>;
}
impl AsOptionApiKey for &str {
fn api_key(self) -> Option<String> {
Some(self.to_string())
}
}
impl AsOptionApiKey for String {
fn api_key(self) -> Option<String> {
Some(self)
}
}
impl AsOptionApiKey for Option<String> {
fn api_key(self) -> Option<String> {
self
}
}
impl AsOptionApiKey for Option<&String> {
fn api_key(self) -> Option<String> {
self.map(ToOwned::to_owned)
}
}
impl AsOptionApiKey for Option<&str> {
fn api_key(self) -> Option<String> {
self.map(ToOwned::to_owned)
}
}
impl<E: Sized> AsOptionApiKey for Result<String, E> {
fn api_key(self) -> Option<String> {
self.ok()
}
}