use super::http::{HttpConfig, HttpConfigBuilder};
use super::{Credentials, CredentialsBuilder};
use crate::OpenAI;
use crate::common::types::Body;
use crate::config::CredentialsBuilderError;
use http::header::IntoHeaderName;
use http::{HeaderMap, HeaderValue};
use std::fmt;
use std::time::Duration;
#[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<CredentialsBuilderError> for ConfigBuildError {
fn from(err: CredentialsBuilderError) -> Self {
ConfigBuildError::RequiredFieldMissing(err.to_string())
}
}
pub struct Config {
credentials: Credentials,
http: HttpConfig,
retry_count: usize,
}
impl Config {
pub fn new(api_key: impl Into<String>, base_url: impl Into<String>) -> Self {
Self {
credentials: Credentials::new(api_key.into(), base_url.into()),
http: HttpConfig::default(),
retry_count: 5,
}
}
pub fn builder() -> ConfigBuilder {
ConfigBuilder {
retry_count: 5,
credentials_builder: CredentialsBuilder::default(),
http_builder: HttpConfigBuilder::default(),
}
}
#[inline]
pub fn api_key(&self) -> &str {
self.credentials.api_key()
}
#[inline]
pub fn base_url(&self) -> &str {
self.credentials.base_url()
}
#[inline]
pub fn retry_count(&self) -> usize {
self.retry_count
}
#[inline]
pub fn timeout(&self) -> Duration {
self.http.timeout()
}
#[inline]
pub fn proxy(&self) -> Option<&String> {
self.http.proxy()
}
#[inline]
pub fn user_agent(&self) -> Option<&HeaderValue> {
self.http.user_agent()
}
#[inline]
pub fn connect_timeout(&self) -> Duration {
self.http.connect_timeout()
}
#[inline]
pub fn http(&self) -> &HttpConfig {
&self.http
}
#[inline]
pub fn credentials(&self) -> &Credentials {
&self.credentials
}
pub fn with_base_url(&mut self, base_url: impl Into<String>) -> &mut Self {
self.credentials.with_base_url(base_url);
self
}
pub fn with_api_key(&mut self, api_key: impl Into<String>) -> &mut Self {
self.credentials.with_api_key(api_key);
self
}
pub fn with_retry_count(&mut self, retry_count: usize) -> &mut Self {
self.retry_count = retry_count;
self
}
pub fn with_timeout(&mut self, timeout: Duration) -> &mut Self {
self.http.with_timeout(timeout);
self
}
pub fn with_connect_timeout(&mut self, connect_timeout: Duration) -> &mut Self {
self.http.with_connect_timeout(connect_timeout);
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: HeaderValue) -> &mut Self {
self.http.with_user_agent(user_agent);
self
}
}
pub struct ConfigBuilder {
retry_count: usize,
credentials_builder: CredentialsBuilder,
http_builder: HttpConfigBuilder,
}
impl ConfigBuilder {
pub fn build(self) -> Result<Config, ConfigBuildError> {
Ok(Config {
credentials: self.credentials_builder.build()?,
http: self.http_builder.build()?,
retry_count: self.retry_count,
})
}
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.credentials_builder = self.credentials_builder.api_key(api_key.into());
self
}
pub fn base_url(mut self, base_url: impl Into<String>) -> Self {
self.credentials_builder = self.credentials_builder.base_url(base_url.into());
self
}
pub fn retry_count(mut self, retry_count: usize) -> Self {
self.retry_count = retry_count;
self
}
pub fn timeout(mut self, timeout: Duration) -> Self {
self.http_builder = self.http_builder.timeout(timeout);
self
}
pub fn connect_timeout(mut self, connect_timeout: Duration) -> Self {
self.http_builder = self.http_builder.connect_timeout(connect_timeout);
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: HeaderValue) -> Self {
self.http_builder = self.http_builder.user_agent(user_agent);
self
}
pub fn header<K: IntoHeaderName>(mut self, key: K, value: HeaderValue) -> Self {
self.http_builder = self.http_builder.header(key, value);
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 headers(mut self, headers: HeaderMap) -> Self {
self.http_builder = self.http_builder.headers(headers);
self
}
pub fn bodys(mut self, bodys: Body) -> Self {
self.http_builder = self.http_builder.bodys(bodys);
self
}
}