use regex::Regex;
use serde::Deserialize;
#[derive(Clone, Debug, Deserialize)]
pub struct Config {
#[serde(default)]
pub server: ServerConfig,
pub sources: SourceConfig,
#[serde(default)]
pub generator: GeneratorConfig,
#[serde(default)]
pub templates: TemplatesConfig,
#[serde(default)]
pub metrics: MetricsConfig,
}
#[derive(Clone, Debug, Deserialize)]
pub struct ServerConfig {
#[serde(default = "ServerConfig::default_bind")]
pub bind: String,
}
#[derive(Clone, Debug, Deserialize)]
pub struct MetricsConfig {
#[serde(default)]
pub enable: bool,
#[serde(default)]
pub labels: Vec<MetricsLabel>,
#[serde(default = "MetricsConfig::default_bind")]
pub bind: String,
#[serde(default)]
pub agent_group: Vec<AgentGroupConfig>,
}
impl MetricsConfig {
fn default_bind() -> String {
"127.0.0.1:42042".to_string()
}
}
impl Default for MetricsConfig {
fn default() -> Self {
Self {
enable: Default::default(),
labels: Default::default(),
bind: Self::default_bind(),
agent_group: Default::default(),
}
}
}
#[derive(Clone, Debug, Deserialize, PartialEq)]
pub enum MetricsLabel {
Host,
UserAgent,
UserAgentGroup,
}
#[derive(Clone, Debug, Deserialize)]
pub struct AgentGroupConfig {
#[serde(with = "serde_regex")]
pub agent: Regex,
pub group: String,
}
impl ServerConfig {
fn default_bind() -> String {
"127.0.0.1:42069".to_string()
}
}
impl Default for ServerConfig {
fn default() -> Self {
Self {
bind: Self::default_bind(),
}
}
}
#[derive(Clone, Debug, Deserialize)]
pub struct SourceConfig {
pub markov: Vec<String>,
pub words: String,
}
#[derive(Clone, Debug, Deserialize, Default)]
pub struct GeneratorConfig {
#[serde(default)]
pub initial_seed: String,
}
#[derive(Clone, Debug, Deserialize, Default)]
pub struct TemplatesConfig {
pub directory: Option<String>,
#[serde(skip)]
pub main: Option<String>,
#[serde(default)]
pub minify: TemplatesMinifyConfig,
}
#[derive(Clone, Debug, Deserialize, Default)]
pub struct TemplatesMinifyConfig {
#[serde(default)]
pub enable: bool,
#[serde(default)]
pub minify_css: bool,
}