use crate::deserialize::DeserializeVecLenient;
use serde::{Deserialize, Serialize};
use serde_alias::serde_alias;
use serde_inline_default::serde_inline_default;
use serde_with::{formats::CommaSeparator, serde_as, PickFirst, StringWithSeparator};
use url::Url;
#[serde_alias(ScreamingSnakeCase)]
#[serde_inline_default]
#[serde_as]
#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)]
pub struct TlsConfig {
#[serde_inline_default(true)]
pub verify: bool,
#[serde(default)]
pub cert: Option<String>,
}
#[serde_alias(ScreamingSnakeCase)]
#[serde_inline_default]
#[serde_as]
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct Config {
pub url: Url,
pub username: Option<String>,
pub password: Option<String>,
pub mfa_token: Option<String>,
pub mfa_secret: Option<String>,
pub auth_token: Option<String>,
#[serde_as(
as = "PickFirst<(DeserializeVecLenient<String>, StringWithSeparator::<CommaSeparator, String>)>"
)]
#[serde(default)]
pub headers: Vec<String>,
#[serde_inline_default(30.0)]
pub connect_timeout: f64,
#[serde_inline_default(30.0)]
pub call_timeout: f64,
pub tls: TlsConfig,
}
impl Default for Config {
fn default() -> Self {
Self {
url: Url::parse("http://localhost:3001").unwrap(),
username: None,
password: None,
mfa_token: None,
mfa_secret: None,
auth_token: None,
headers: Vec::new(),
connect_timeout: 30.0,
call_timeout: 30.0,
tls: TlsConfig::default(),
}
}
}