use crate::shortcode::{Registry, Shortcode};
use serde::Deserialize;
use std::collections::BTreeMap;
use std::path::Path;
#[derive(Clone, Debug, Default, Deserialize, PartialEq, Eq)]
pub struct Config {
#[serde(default)]
pub project: Project,
#[serde(default)]
pub compile: Compile,
#[serde(default)]
pub shortcodes: BTreeMap<String, Shortcode>,
#[serde(default)]
pub hooks: Hooks,
}
#[derive(Clone, Debug, Default, Deserialize, PartialEq, Eq)]
pub struct Project {
#[serde(default)]
pub name: String,
#[serde(default)]
pub version: String,
}
#[derive(Clone, Debug, Default, Deserialize, PartialEq, Eq)]
pub struct Compile {
#[serde(default)]
pub strict_heading_levels: bool,
#[serde(default)]
pub default_target: Option<String>,
#[serde(default)]
pub llm: LlmCompile,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Eq)]
pub struct LlmCompile {
#[serde(default = "default_minify_code_blocks")]
pub minify_code_blocks: bool,
#[serde(default = "default_minify_languages")]
pub minify_languages: Vec<String>,
#[serde(default = "default_preserve_code_fences")]
pub preserve_code_fences: bool,
}
impl Default for LlmCompile {
fn default() -> Self {
LlmCompile {
minify_code_blocks: default_minify_code_blocks(),
minify_languages: default_minify_languages(),
preserve_code_fences: default_preserve_code_fences(),
}
}
}
fn default_minify_code_blocks() -> bool {
true
}
fn default_minify_languages() -> Vec<String> {
vec![
"json".into(),
"jsonl".into(),
"rust".into(),
"rs".into(),
"c".into(),
"h".into(),
"cpp".into(),
"c++".into(),
"cc".into(),
"cxx".into(),
"hpp".into(),
"hxx".into(),
"java".into(),
"go".into(),
"javascript".into(),
"js".into(),
"typescript".into(),
"ts".into(),
"sql".into(),
]
}
fn default_preserve_code_fences() -> bool {
true
}
#[derive(Clone, Debug, Default, Deserialize, PartialEq, Eq)]
pub struct Hooks {
#[serde(default)]
pub before_compile: Vec<String>,
#[serde(default)]
pub after_compile: Vec<String>,
}
pub fn load(path: &Path) -> Result<Config, String> {
let text = std::fs::read_to_string(path).map_err(|e| e.to_string())?;
toml::from_str(&text).map_err(|e| e.to_string())
}
pub fn registry_from(cfg: &Config) -> Registry {
let mut reg = Registry::with_builtins();
reg.extend(cfg.shortcodes.clone());
reg
}