use serde::Deserialize;
use std::collections::HashMap;
#[derive(Debug, Deserialize, PartialEq, Default)]
#[serde(deny_unknown_fields)]
pub struct InternalErrorReportingRaw {
#[serde(default)] pub enabled: bool,
}
#[derive(Debug, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct ConfigRaw {
#[serde(default = "default_version")]
pub version: u32,
#[serde(default)] pub appenders: HashMap<String, AppenderConfigRaw>,
#[serde(default)] pub loggers: HashMap<String, LoggerConfigRaw>,
#[serde(default)]
pub internal_error_reporting: InternalErrorReportingRaw,
}
fn default_version() -> u32 {
1
}
#[derive(Debug, Deserialize, PartialEq)]
#[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)] pub enum AppenderConfigRaw {
Console(ConsoleAppenderConfigRaw),
File(FileAppenderConfigRaw),
RollingFile(RollingFileAppenderConfigRaw),
Custom(CustomAppenderConfigRaw),
DebugReport(DebugReportAppenderConfigRaw),
}
#[derive(Debug, Deserialize, PartialEq, Clone, Copy)]
#[serde(rename_all = "snake_case")]
pub enum OverflowPolicyRaw {
Drop,
Block,
}
#[derive(Debug, Deserialize, PartialEq, Default)]
#[serde(deny_unknown_fields)]
pub struct ConsoleAppenderConfigRaw {
#[serde(default)]
pub encoder: Option<EncoderConfigRaw>,
#[serde(default)]
pub channel_capacity: Option<usize>,
#[serde(default)]
pub overflow: Option<OverflowPolicyRaw>,
}
#[derive(Debug, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct FileAppenderConfigRaw {
pub path: String,
#[serde(default)]
pub encoder: Option<EncoderConfigRaw>,
#[serde(default)]
pub channel_capacity: Option<usize>,
#[serde(default)]
pub overflow: Option<OverflowPolicyRaw>,
}
fn default_file_name_suffix() -> String {
".log".to_string()
}
fn default_file_name_prefix() -> String {
"fibre_logging.log".to_string()
}
#[derive(Debug, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct RollingFileAppenderConfigRaw {
pub directory: String,
#[serde(default = "default_file_name_prefix")]
pub file_name_prefix: String,
#[serde(default = "default_file_name_suffix")]
pub file_name_suffix: String,
pub policy: RollingPolicyRaw,
#[serde(default)]
pub encoder: Option<EncoderConfigRaw>,
#[serde(default)]
pub channel_capacity: Option<usize>,
#[serde(default)]
pub overflow: Option<OverflowPolicyRaw>,
}
#[derive(Debug, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct RollingPolicyRaw {
pub time_granularity: String,
pub max_file_size: Option<String>,
pub max_retained_sequences: Option<u32>,
pub compression: Option<CompressionPolicyRaw>,
}
#[derive(Debug, Deserialize, PartialEq, Clone)]
#[serde(deny_unknown_fields)]
pub struct CompressionPolicyRaw {
pub compressed_file_suffix: String,
#[serde(default)]
pub max_uncompressed_sequences: u32,
}
#[derive(Debug, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct CustomAppenderConfigRaw {
#[serde(default = "default_buffer_size")]
pub buffer_size: usize,
#[serde(default)]
pub overflow: Option<OverflowPolicyRaw>,
}
fn default_buffer_size() -> usize {
256 }
#[derive(Debug, Deserialize, PartialEq, Default)]
#[serde(deny_unknown_fields)]
pub struct DebugReportAppenderConfigRaw {
pub print_interval: Option<String>,
}
#[derive(Debug, Deserialize, PartialEq, Clone)] #[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)]
pub enum EncoderConfigRaw {
Pattern(PatternEncoderConfigRaw),
JsonLines(JsonLinesEncoderConfigRaw),
}
#[derive(Debug, Deserialize, PartialEq, Clone, Default)]
#[serde(deny_unknown_fields)]
pub struct PatternEncoderConfigRaw {
pub pattern: Option<String>,
}
#[derive(Debug, Deserialize, PartialEq, Clone, Default)]
#[serde(deny_unknown_fields)]
pub struct JsonLinesEncoderConfigRaw {
#[serde(default)]
pub flatten_fields: bool,
}
#[derive(Debug, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct LoggerConfigRaw {
pub level: String,
#[serde(default)]
pub appenders: Vec<String>, #[serde(default = "default_additive")]
pub additive: bool,
}
fn default_additive() -> bool {
true
}
impl Default for ConfigRaw {
fn default() -> Self {
Self {
version: default_version(),
appenders: HashMap::new(),
loggers: HashMap::new(),
internal_error_reporting: Default::default(),
}
}
}
impl AppenderConfigRaw {
pub fn encoder_config_raw(&self) -> Option<EncoderConfigRaw> {
match self {
AppenderConfigRaw::Console(c) => c.encoder.clone(),
AppenderConfigRaw::File(f) => f.encoder.clone(),
AppenderConfigRaw::RollingFile(r) => r.encoder.clone(),
AppenderConfigRaw::Custom(_) => None,
AppenderConfigRaw::DebugReport(_) => None,
}
}
}