use crate::cli::path_resolver::PathResolver;
use crate::error::{anyhow::Context, CliError, ScrapsResult};
use chrono_tz::Tz;
use config::Config;
use scraps_libs::model::base_url::BaseUrl;
use serde::Deserialize;
use std::path::{Path, PathBuf};
use url::Url;
use super::{
base_url::BaseUrlConfig, color_scheme::ColorSchemeConfig, lang::LangCodeConfig,
sort_key::SortKeyConfig,
};
#[derive(Debug, Deserialize)]
pub struct SsgConfig {
pub base_url: BaseUrlConfig,
pub title: String,
pub lang_code: Option<LangCodeConfig>,
pub description: Option<String>,
pub favicon: Option<Url>,
pub build_search_index: Option<bool>,
pub sort_key: Option<SortKeyConfig>,
pub paginate_by: Option<usize>,
pub color_scheme: Option<ColorSchemeConfig>,
}
impl SsgConfig {
pub fn base_url(&self) -> BaseUrl {
self.base_url.clone().into_base_url()
}
}
#[derive(Debug, Deserialize, Default)]
pub struct LintConfig {
pub stale_by_git: Option<StaleByGitConfig>,
}
#[derive(Debug, Deserialize)]
pub struct StaleByGitConfig {
#[serde(default = "default_true")]
pub enabled: bool,
pub threshold_days: Option<u64>,
}
fn default_true() -> bool {
true
}
#[derive(Debug, Deserialize)]
pub struct ScrapConfig {
pub output_dir: Option<PathBuf>,
pub timezone: Option<Tz>,
pub ssg: Option<SsgConfig>,
pub lint: Option<LintConfig>,
}
impl ScrapConfig {
pub fn from_path(project_path: Option<&Path>) -> ScrapsResult<ScrapConfig> {
let path_resolver = PathResolver::new(project_path)?;
let config_path = path_resolver.config_path();
let config = Config::builder()
.add_source(config::File::from(config_path))
.build()
.context(CliError::ConfigLoad)?;
config
.try_deserialize::<ScrapConfig>()
.context(CliError::InvalidConfigFormat)
}
pub fn require_ssg(&self) -> ScrapsResult<&SsgConfig> {
self.ssg
.as_ref()
.ok_or_else(|| CliError::MissingSsgSection.into())
}
pub fn get_base_url(&self) -> Option<BaseUrl> {
self.ssg.as_ref().map(|s| s.base_url())
}
}