iocaine 2.0.0

The deadliest poison known to AI
Documentation
// SPDX-FileCopyrightText: 2025 Gergely Nagy
// SPDX-FileContributor: Gergely Nagy
//
// SPDX-License-Identifier: MIT

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,
}