use super::{BootstrapConfigLoadingError, BootstrapConfigRaw};
use crate::log::LogLevel;
use serde::{Deserialize, Serialize};
use std::time::Duration;
use url::Url;
pub use crate::log::StdOutLoggerMode;
#[derive(Debug, Clone, PartialEq)]
pub struct LogConfig {
pub log_type: LogTypeConfig,
pub log_level: LogLevel,
}
#[derive(Debug, Clone, PartialEq)]
pub enum LogTypeConfig {
Off,
Memory(MemoryLogConfig),
StdOut(StdOutLoggerMode),
}
#[derive(Debug, Copy, Clone, PartialEq, Serialize, Deserialize)]
pub struct MemoryLogConfig {
pub log_ttl: u64,
pub max_items: Option<usize>,
pub max_item_size: Option<usize>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
#[serde(rename_all = "lowercase")]
pub enum StdOutMode {
#[cfg(not(target_arch = "wasm32"))]
Async,
#[default]
Immediate,
}
#[cfg(not(target_arch = "wasm32"))]
const PARSE_STDOUT_MODE_ERR: &str = "Invalid stdout mode. Must be 'async' or 'immediate'";
#[cfg(target_arch = "wasm32")]
const PARSE_STDOUT_MODE_ERR: &str = "Invalid stdout mode. Must be 'immediate'";
impl std::str::FromStr for StdOutMode {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s.to_lowercase().as_str() {
#[cfg(not(target_arch = "wasm32"))]
"async" => Ok(StdOutMode::Async),
"immediate" => Ok(StdOutMode::Immediate),
_ => Err(PARSE_STDOUT_MODE_ERR.to_string()),
}
}
}
impl std::fmt::Display for StdOutMode {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
#[cfg(not(target_arch = "wasm32"))]
StdOutMode::Async => write!(f, "async"),
StdOutMode::Immediate => write!(f, "immediate"),
}
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct LockServiceConfig {
pub log_level: LogLevel,
pub config_uri: Url,
pub dynamic_config: bool,
pub ssa_jwt: Option<String>,
pub log_interval: Option<Duration>,
pub health_interval: Option<Duration>,
pub telemetry_interval: Option<Duration>,
pub listen_sse: bool,
pub accept_invalid_certs: bool,
}
impl TryFrom<&BootstrapConfigRaw> for LockServiceConfig {
type Error = BootstrapConfigLoadingError;
fn try_from(raw: &BootstrapConfigRaw) -> Result<Self, Self::Error> {
let config_uri = raw
.lock_server_configuration_uri
.clone()
.ok_or(BootstrapConfigLoadingError::MissingLockServerConfigUri)?
.parse()?;
let ssa_jwt = raw.lock_ssa_jwt.clone();
let log_interval =
(raw.audit_log_interval > 0).then(|| Duration::from_secs(raw.audit_log_interval));
let health_interval =
(raw.audit_health_interval > 0).then(|| Duration::from_secs(raw.audit_health_interval));
let telemetry_interval = (raw.audit_telemetry_interval > 0)
.then(|| Duration::from_secs(raw.audit_telemetry_interval));
let listen_sse = raw.listen_sse.into();
Ok(LockServiceConfig {
config_uri,
dynamic_config: raw.dynamic_configuration.into(),
ssa_jwt,
log_interval,
health_interval,
telemetry_interval,
listen_sse,
log_level: raw.log_level,
accept_invalid_certs: raw.accept_invalid_certs.into(),
})
}
}
pub struct MemoryLogConfigRaw {
pub log_ttl: u64,
pub max_item_size: Option<usize>,
pub max_items: Option<usize>,
}