use std::time::Duration;
use schemars::JsonSchema;
use serde::Deserialize;
use serde::Serialize;
use crate::configuration::RedisCache;
use crate::configuration::TlsClient;
use crate::configuration::default_metrics_interval;
use crate::configuration::default_required_to_start;
#[derive(Debug, Clone, Deserialize, Serialize, JsonSchema, PartialEq)]
#[serde(deny_unknown_fields)]
pub(crate) struct Config {
pub(crate) urls: Vec<url::Url>,
pub(crate) username: Option<String>,
pub(crate) password: Option<String>,
#[serde(
deserialize_with = "humantime_serde::deserialize",
default = "default_fetch_timeout"
)]
#[schemars(with = "Option<String>", default)]
pub(crate) fetch_timeout: Duration,
#[serde(
deserialize_with = "humantime_serde::deserialize",
default = "default_insert_timeout"
)]
#[schemars(with = "Option<String>", default)]
pub(crate) insert_timeout: Duration,
#[serde(
deserialize_with = "humantime_serde::deserialize",
default = "default_invalidate_timeout"
)]
#[schemars(with = "Option<String>", default)]
pub(crate) invalidate_timeout: Duration,
#[serde(
deserialize_with = "humantime_serde::deserialize",
default = "default_maintenance_timeout"
)]
#[schemars(with = "Option<String>", default)]
pub(crate) maintenance_timeout: Duration,
pub(crate) namespace: Option<String>,
#[serde(default)]
pub(crate) tls: Option<TlsClient>,
#[serde(default = "default_required_to_start")]
pub(crate) required_to_start: bool,
#[serde(default = "default_pool_size")]
pub(crate) pool_size: u32,
#[serde(
deserialize_with = "humantime_serde::deserialize",
default = "default_metrics_interval"
)]
#[schemars(with = "Option<String>", default)]
pub(crate) metrics_interval: Duration,
}
fn default_fetch_timeout() -> Duration {
Duration::from_millis(150)
}
fn default_insert_timeout() -> Duration {
Duration::from_millis(500)
}
fn default_invalidate_timeout() -> Duration {
Duration::from_secs(1)
}
fn default_maintenance_timeout() -> Duration {
Duration::from_millis(500)
}
fn default_pool_size() -> u32 {
5
}
impl From<&Config> for RedisCache {
fn from(value: &Config) -> Self {
let timeout = value
.fetch_timeout
.max(value.insert_timeout)
.max(value.invalidate_timeout)
.max(value.maintenance_timeout);
Self {
urls: value.urls.clone(),
username: value.username.clone(),
password: value.password.clone(),
timeout,
ttl: None,
namespace: value.namespace.clone(),
tls: value.tls.clone(),
required_to_start: value.required_to_start,
reset_ttl: false,
pool_size: value.pool_size,
metrics_interval: value.metrics_interval,
}
}
}
#[cfg(all(
test,
any(not(feature = "ci"), all(target_arch = "x86_64", target_os = "linux"))
))]
impl Config {
pub(crate) fn test(clustered: bool, namespace: &str) -> Self {
let url = if clustered {
"redis-cluster://127.0.0.1:7000"
} else {
"redis://127.0.0.1:6379"
};
serde_json_bytes::from_value(serde_json_bytes::json!({
"urls": [url],
"namespace": namespace,
"pool_size": 1,
"required_to_start": true,
}))
.unwrap()
}
}