use std::time::Duration;
use crate::{Error, Result};
use url::Url;
fn validate_base_url(base_url: &str) -> Result<()> {
let url = Url::parse(base_url)?;
if url.scheme() != "http" && url.scheme() != "https" {
return Err(Error::InvalidUrlError(
url::ParseError::RelativeUrlWithoutBase,
));
}
Ok(())
}
#[derive(Debug, Clone)]
pub struct ClientConfig {
base_url: String,
timeout: Duration,
max_retries: u32,
}
impl Default for ClientConfig {
fn default() -> Self {
Self {
base_url: "http://localhost:11434".to_string(),
timeout: Duration::from_secs(30),
max_retries: 3,
}
}
}
impl ClientConfig {
pub fn new(base_url: String, timeout: Duration, max_retries: u32) -> Result<Self> {
validate_base_url(&base_url)?;
Ok(Self {
base_url,
timeout,
max_retries,
})
}
pub fn with_base_url(base_url: String) -> Result<Self> {
validate_base_url(&base_url)?;
Ok(Self {
base_url,
..Self::default()
})
}
pub fn with_base_url_and_timeout(base_url: String, timeout: Duration) -> Result<Self> {
validate_base_url(&base_url)?;
Ok(Self {
base_url,
timeout,
..Self::default()
})
}
#[inline]
pub fn base_url(&self) -> &str {
&self.base_url
}
#[inline]
pub fn timeout(&self) -> Duration {
self.timeout
}
#[inline]
pub fn max_retries(&self) -> u32 {
self.max_retries
}
#[inline]
pub fn url(&self, endpoint: &str) -> String {
format!("{}{}", self.base_url, endpoint)
}
}