blob: 0f4ed9e97a88275ea4fd03ebafad84ef3d7e5f7a [file]
use crate::archiver::ArchiverKind;
use crate::configs::config_provider::ConfigProvider;
use crate::configs::http::HttpConfig;
use crate::configs::quic::QuicConfig;
use crate::configs::system::SystemConfig;
use crate::configs::tcp::TcpConfig;
use crate::server_error::ServerError;
use iggy::utils::duration::IggyDuration;
use iggy::validatable::Validatable;
use serde::{Deserialize, Serialize};
use serde_with::serde_as;
use serde_with::DisplayFromStr;
use std::sync::Arc;
#[derive(Debug, Deserialize, Serialize, Clone)]
pub struct ServerConfig {
pub data_maintenance: DataMaintenanceConfig,
pub message_saver: MessageSaverConfig,
pub personal_access_token: PersonalAccessTokenConfig,
pub heartbeat: HeartbeatConfig,
pub system: Arc<SystemConfig>,
pub quic: QuicConfig,
pub tcp: TcpConfig,
pub http: HttpConfig,
}
#[serde_as]
#[derive(Debug, Default, Deserialize, Serialize, Clone)]
pub struct DataMaintenanceConfig {
pub archiver: ArchiverConfig,
pub messages: MessagesMaintenanceConfig,
pub state: StateMaintenanceConfig,
}
#[derive(Debug, Deserialize, Serialize, Clone)]
pub struct ArchiverConfig {
pub enabled: bool,
pub kind: ArchiverKind,
pub disk: Option<DiskArchiverConfig>,
pub s3: Option<S3ArchiverConfig>,
}
#[serde_as]
#[derive(Debug, Deserialize, Serialize, Clone)]
pub struct MessagesMaintenanceConfig {
pub archiver_enabled: bool,
pub cleaner_enabled: bool,
#[serde_as(as = "DisplayFromStr")]
pub interval: IggyDuration,
}
#[serde_as]
#[derive(Debug, Deserialize, Serialize, Clone)]
pub struct StateMaintenanceConfig {
pub archiver_enabled: bool,
pub overwrite: bool,
#[serde_as(as = "DisplayFromStr")]
pub interval: IggyDuration,
}
#[derive(Debug, Deserialize, Serialize, Clone)]
pub struct DiskArchiverConfig {
pub path: String,
}
#[derive(Debug, Deserialize, Serialize, Clone)]
pub struct S3ArchiverConfig {
pub key_id: String,
pub key_secret: String,
pub bucket: String,
pub endpoint: Option<String>,
pub region: Option<String>,
pub tmp_upload_dir: String,
}
#[serde_as]
#[derive(Debug, Deserialize, Serialize, Clone)]
pub struct MessageSaverConfig {
pub enabled: bool,
pub enforce_fsync: bool,
#[serde_as(as = "DisplayFromStr")]
pub interval: IggyDuration,
}
#[derive(Debug, Deserialize, Serialize, Clone)]
pub struct PersonalAccessTokenConfig {
pub max_tokens_per_user: u32,
pub cleaner: PersonalAccessTokenCleanerConfig,
}
#[serde_as]
#[derive(Debug, Deserialize, Serialize, Clone)]
pub struct PersonalAccessTokenCleanerConfig {
pub enabled: bool,
#[serde_as(as = "DisplayFromStr")]
pub interval: IggyDuration,
}
#[serde_as]
#[derive(Debug, Deserialize, Serialize, Clone)]
pub struct HeartbeatConfig {
pub enabled: bool,
#[serde_as(as = "DisplayFromStr")]
pub interval: IggyDuration,
}
impl ServerConfig {
pub async fn load(config_provider: &dyn ConfigProvider) -> Result<ServerConfig, ServerError> {
let server_config = config_provider.load_config().await?;
server_config.validate()?;
Ok(server_config)
}
}