use serde::Deserialize;
use std::path::Path;
#[derive(Deserialize, Default)]
pub struct Config {
#[serde(default)]
pub site: SiteConfig,
#[serde(default)]
pub languages: LanguagesConfig,
}
#[derive(Deserialize, Default)]
pub struct SiteConfig {
pub title: Option<String>,
pub description: Option<String>,
}
#[derive(Deserialize)]
pub struct LanguagesConfig {
#[serde(default = "default_lang")]
pub default: String,
#[serde(default)]
pub order: Vec<String>,
}
impl Default for LanguagesConfig {
fn default() -> Self {
Self {
default: "en".to_string(),
order: Vec::new(),
}
}
}
fn default_lang() -> String {
"en".to_string()
}
impl Config {
pub fn load(src: &Path) -> Self {
let path = src.join("lagrange.toml");
if let Ok(content) = std::fs::read_to_string(&path) {
toml::from_str(&content).unwrap_or_default()
} else {
Self::default()
}
}
pub fn ordered_langs(&self, available: &[String]) -> Vec<String> {
if self.languages.order.is_empty() {
let mut sorted = available.to_vec();
sorted.sort();
return sorted;
}
self.languages
.order
.iter()
.filter(|l| available.contains(l))
.cloned()
.collect()
}
}