use confique::Config;
use lex_babel::formats::lex::formatting_rules::FormattingRules;
use serde::{Deserialize, Serialize};
pub const CONFIG_FILE_NAME: &str = ".lex.toml";
#[derive(Debug, Clone, Config, Serialize, Deserialize)]
pub struct LexConfig {
#[config(nested)]
pub formatting: FormattingConfig,
#[config(nested)]
pub inspect: InspectConfig,
#[config(nested)]
pub convert: ConvertConfig,
#[config(nested)]
pub diagnostics: DiagnosticsConfig,
#[config(nested)]
pub includes: IncludesConfig,
}
#[derive(Debug, Clone, Config, Serialize, Deserialize)]
pub struct FormattingConfig {
#[config(nested)]
pub rules: FormattingRulesConfig,
#[config(default = false)]
pub format_on_save: bool,
}
#[derive(Debug, Clone, Config, Serialize, Deserialize)]
pub struct FormattingRulesConfig {
#[config(default = 1)]
pub session_blank_lines_before: usize,
#[config(default = 1)]
pub session_blank_lines_after: usize,
#[config(default = true)]
pub normalize_seq_markers: bool,
#[config(default = "-")]
pub unordered_seq_marker: char,
#[config(default = 2)]
pub max_blank_lines: usize,
#[config(default = " ")]
pub indent_string: String,
#[config(default = false)]
pub preserve_trailing_blanks: bool,
#[config(default = true)]
pub normalize_verbatim_markers: bool,
}
impl From<FormattingRulesConfig> for FormattingRules {
fn from(config: FormattingRulesConfig) -> Self {
FormattingRules {
session_blank_lines_before: config.session_blank_lines_before,
session_blank_lines_after: config.session_blank_lines_after,
normalize_seq_markers: config.normalize_seq_markers,
unordered_seq_marker: config.unordered_seq_marker,
max_blank_lines: config.max_blank_lines,
indent_string: config.indent_string,
preserve_trailing_blanks: config.preserve_trailing_blanks,
normalize_verbatim_markers: config.normalize_verbatim_markers,
}
}
}
impl From<&FormattingRulesConfig> for FormattingRules {
fn from(config: &FormattingRulesConfig) -> Self {
FormattingRules {
session_blank_lines_before: config.session_blank_lines_before,
session_blank_lines_after: config.session_blank_lines_after,
normalize_seq_markers: config.normalize_seq_markers,
unordered_seq_marker: config.unordered_seq_marker,
max_blank_lines: config.max_blank_lines,
indent_string: config.indent_string.clone(),
preserve_trailing_blanks: config.preserve_trailing_blanks,
normalize_verbatim_markers: config.normalize_verbatim_markers,
}
}
}
#[derive(Debug, Clone, Config, Serialize, Deserialize)]
pub struct InspectConfig {
#[config(nested)]
pub ast: InspectAstConfig,
#[config(nested)]
pub nodemap: NodemapConfig,
}
#[derive(Debug, Clone, Config, Serialize, Deserialize)]
pub struct InspectAstConfig {
#[config(default = false)]
pub include_all_properties: bool,
#[config(default = true)]
pub show_line_numbers: bool,
}
#[derive(Debug, Clone, Config, Serialize, Deserialize)]
pub struct NodemapConfig {
#[config(default = false)]
pub color_blocks: bool,
#[config(default = false)]
pub color_characters: bool,
#[config(default = false)]
pub show_summary: bool,
}
#[derive(Debug, Clone, Config, Serialize, Deserialize)]
pub struct ConvertConfig {
#[config(nested)]
pub pdf: PdfConfig,
#[config(nested)]
pub html: HtmlConfig,
}
#[derive(Debug, Clone, Config, Serialize, Deserialize)]
pub struct PdfConfig {
#[config(default = "lexed")]
pub size: PdfPageSize,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum PdfPageSize {
#[serde(rename = "lexed")]
LexEd,
#[serde(rename = "mobile")]
Mobile,
}
#[derive(Debug, Clone, Config, Serialize, Deserialize)]
pub struct HtmlConfig {
#[config(default = "default")]
pub theme: String,
pub custom_css: Option<String>,
}
#[derive(Debug, Clone, Config, Serialize, Deserialize)]
pub struct DiagnosticsConfig {
#[config(default = true)]
pub spellcheck: bool,
}
#[derive(Debug, Clone, Config, Serialize, Deserialize)]
pub struct IncludesConfig {
pub root: Option<String>,
#[config(default = 8)]
pub max_depth: usize,
}
#[cfg(test)]
mod tests {
use super::*;
fn load_defaults() -> LexConfig {
clapfig::Clapfig::builder::<LexConfig>()
.app_name("lex")
.no_env()
.search_paths(vec![])
.load()
.expect("defaults to load")
}
#[test]
fn loads_default_config() {
let config = load_defaults();
assert_eq!(config.formatting.rules.session_blank_lines_before, 1);
assert!(config.inspect.ast.show_line_numbers);
assert_eq!(config.convert.pdf.size, PdfPageSize::LexEd);
}
#[test]
fn formatting_rules_config_converts_to_formatting_rules() {
let config = load_defaults();
let rules: FormattingRules = config.formatting.rules.into();
assert_eq!(rules.session_blank_lines_before, 1);
assert_eq!(rules.session_blank_lines_after, 1);
assert!(rules.normalize_seq_markers);
assert_eq!(rules.unordered_seq_marker, '-');
assert_eq!(rules.max_blank_lines, 2);
assert_eq!(rules.indent_string, " ");
assert!(!rules.preserve_trailing_blanks);
assert!(rules.normalize_verbatim_markers);
}
}