use std::fmt;
use std::fmt::{Display, Formatter};
use crate::RequestStrategy;
#[derive(Clone)]
pub struct SharedConfigBuilder {
pub app_info_str: Option<String>,
pub request_strategy: Option<RequestStrategy>,
pub secret: String,
pub api_base: Option<String>,
}
impl SharedConfigBuilder {
pub fn new(secret: impl Into<String>) -> Self {
let secret = secret.into();
if secret.trim() != secret || !secret.starts_with("sk_") {
tracing::warn!("suspiciously formatted secret key")
}
Self {
app_info_str: None,
request_strategy: None,
secret,
api_base: None,
}
}
pub fn request_strategy(mut self, strategy: RequestStrategy) -> Self {
self.request_strategy = Some(strategy);
self
}
pub fn url(mut self, url: impl Into<String>) -> Self {
self.api_base = Some(url.into());
self
}
pub fn app_info(
mut self,
name: impl Into<String>,
version: Option<String>,
url: Option<String>,
) -> Self {
self.app_info_str = Some(AppInfo { name: name.into(), url, version }.to_string());
self
}
}
struct AppInfo {
name: String,
url: Option<String>,
version: Option<String>,
}
impl Display for AppInfo {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
let name = &self.name;
match (&self.version, &self.url) {
(Some(a), Some(b)) => write!(f, "{name}/{a} ({b})"),
(Some(a), None) => write!(f, "{name}/{a}"),
(None, Some(b)) => write!(f, "{name} ({b})"),
_ => f.write_str(name),
}
}
}
impl fmt::Debug for SharedConfigBuilder {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
let mut builder = f.debug_struct("SharedConfigBuilder");
builder.field("request_strategy", &self.request_strategy);
builder.field("app_info_str", &self.app_info_str);
if let Some(api_base) = &self.api_base {
builder.field("api_base", api_base);
}
builder.finish()
}
}
#[derive(Debug)]
#[non_exhaustive]
pub struct ConfigOverride {
pub request_strategy: Option<RequestStrategy>,
}
impl ConfigOverride {
pub(crate) fn new() -> Self {
Self { request_strategy: None }
}
}