use super::base::{BaseConfig, BaseConfigBuilder};
use super::http::{HttpConfig, HttpConfigBuilder};
use crate::{Interceptor, OpenAI, interceptor::InterceptorChain};
use std::{collections::HashMap, fmt};
#[derive(Debug)]
pub enum ConfigBuildError {
RequiredFieldMissing(String),
ValidationError(String),
}
impl fmt::Display for ConfigBuildError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
ConfigBuildError::RequiredFieldMissing(field) => {
write!(f, "Required field missing: {}", field)
}
ConfigBuildError::ValidationError(msg) => {
write!(f, "Validation error: {}", msg)
}
}
}
}
impl std::error::Error for ConfigBuildError {}
impl From<super::http::HttpConfigBuilderError> for ConfigBuildError {
fn from(err: super::http::HttpConfigBuilderError) -> Self {
ConfigBuildError::RequiredFieldMissing(err.to_string())
}
}
impl From<super::base::BaseConfigBuilderError> for ConfigBuildError {
fn from(err: super::base::BaseConfigBuilderError) -> Self {
ConfigBuildError::RequiredFieldMissing(err.to_string())
}
}
pub struct Config {
base: BaseConfig,
http: HttpConfig,
retry_count: u32,
global_interceptors: InterceptorChain,
}
impl Config {
pub fn new(api_key: impl Into<String>, base_url: impl Into<String>) -> Self {
Self {
base: BaseConfig::new(api_key.into(), base_url.into()),
http: HttpConfig::default(),
retry_count: 5,
global_interceptors: InterceptorChain::new(),
}
}
pub fn builder() -> ConfigBuilder {
ConfigBuilder {
retry_count: 5,
base_builder: BaseConfigBuilder::default(),
http_builder: HttpConfigBuilder::default(),
global_interceptors: InterceptorChain::new(),
}
}
#[inline]
pub fn api_key(&self) -> &str {
self.base.api_key()
}
#[inline]
pub fn base_url(&self) -> &str {
self.base.base_url()
}
#[inline]
pub fn retry_count(&self) -> u32 {
self.retry_count
}
#[inline]
pub fn timeout_seconds(&self) -> u64 {
self.http.timeout_seconds()
}
#[inline]
pub fn proxy(&self) -> Option<&String> {
self.http.proxy()
}
#[inline]
pub fn user_agent(&self) -> Option<&String> {
self.http.user_agent()
}
#[inline]
pub fn connect_timeout_seconds(&self) -> u64 {
self.http.connect_timeout_seconds()
}
#[inline]
pub fn http(&self) -> &HttpConfig {
&self.http
}
#[inline]
pub fn base(&self) -> &super::base::BaseConfig {
&self.base
}
#[inline]
pub fn global_interceptors(&self) -> &InterceptorChain {
&self.global_interceptors
}
#[inline]
pub fn global_interceptors_mut(&mut self) -> &mut InterceptorChain {
&mut self.global_interceptors
}
pub fn with_base_url(&mut self, base_url: impl Into<String>) -> &mut Self {
self.base.with_base_url(base_url);
self
}
pub fn with_api_key(&mut self, api_key: impl Into<String>) -> &mut Self {
self.base.with_api_key(api_key);
self
}
pub fn with_retry_count(&mut self, retry_count: u32) -> &mut Self {
self.retry_count = retry_count;
self
}
pub fn with_timeout_seconds(&mut self, timeout_seconds: u64) -> &mut Self {
self.http.with_timeout_seconds(timeout_seconds);
self
}
pub fn with_connect_timeout_seconds(&mut self, connect_timeout_seconds: u64) -> &mut Self {
self.http
.with_connect_timeout_seconds(connect_timeout_seconds);
self
}
pub fn with_proxy(&mut self, proxy: impl Into<String>) -> &mut Self {
self.http.with_proxy(proxy);
self
}
pub fn with_user_agent(&mut self, user_agent: impl Into<String>) -> &mut Self {
self.http.with_user_agent(user_agent);
self
}
pub fn add_global_interceptor(&mut self, interceptor: impl Interceptor + 'static) -> &mut Self {
self.global_interceptors.add_interceptor(interceptor);
self
}
}
pub struct ConfigBuilder {
retry_count: u32,
global_interceptors: InterceptorChain,
base_builder: BaseConfigBuilder,
http_builder: HttpConfigBuilder,
}
impl ConfigBuilder {
pub fn build(self) -> Result<Config, ConfigBuildError> {
Ok(Config {
base: self.base_builder.build()?,
http: self.http_builder.build()?,
retry_count: self.retry_count,
global_interceptors: self.global_interceptors,
})
}
pub fn build_openai(self) -> Result<OpenAI, ConfigBuildError> {
Ok(OpenAI::with_config(self.build()?))
}
pub fn api_key(mut self, api_key: impl Into<String>) -> Self {
self.base_builder = self.base_builder.api_key(api_key.into());
self
}
pub fn base_url(mut self, base_url: impl Into<String>) -> Self {
self.base_builder = self.base_builder.base_url(base_url.into());
self
}
pub fn retry_count(mut self, retry_count: u32) -> Self {
self.retry_count = retry_count;
self
}
pub fn timeout_seconds(mut self, timeout_seconds: u64) -> Self {
self.http_builder = self.http_builder.timeout_seconds(timeout_seconds);
self
}
pub fn connect_timeout_seconds(mut self, connect_timeout_seconds: u64) -> Self {
self.http_builder = self
.http_builder
.connect_timeout_seconds(connect_timeout_seconds);
self
}
pub fn proxy(mut self, proxy: impl Into<String>) -> Self {
self.http_builder = self.http_builder.proxy(proxy.into());
self
}
pub fn user_agent(mut self, user_agent: impl Into<String>) -> Self {
self.http_builder = self.http_builder.user_agent(user_agent.into());
self
}
pub fn header(mut self, key: impl Into<String>, value: impl Into<String>) -> Self {
self.http_builder = self.http_builder.header(key.into(), value.into());
self
}
pub fn query(mut self, key: impl Into<String>, value: impl Into<String>) -> Self {
self.http_builder = self.http_builder.query(key.into(), value.into());
self
}
pub fn body(mut self, key: impl Into<String>, value: impl Into<serde_json::Value>) -> Self {
self.http_builder = self.http_builder.body(key.into(), value.into());
self
}
pub fn global_interceptor(mut self, interceptor: impl Interceptor + 'static) -> Self {
self.global_interceptors.add_interceptor(interceptor);
self
}
pub fn headers(mut self, headers: HashMap<String, String>) -> Self {
self.http_builder = self.http_builder.headers(headers);
self
}
pub fn querys(mut self, queries: HashMap<String, String>) -> Self {
self.http_builder = self.http_builder.querys(queries);
self
}
pub fn bodys(mut self, bodys: HashMap<String, serde_json::Value>) -> Self {
self.http_builder = self.http_builder.bodys(bodys);
self
}
}