use crate::{utils, Opt};
use serde::{Deserialize, Serialize};
use std::{
io,
path::{Component, PathBuf},
};
#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct Config {
#[serde(default)]
pub wikis: Vec<WikiConfig>,
}
impl Config {
pub fn load(opt: &Opt) -> io::Result<Config> {
utils::load_config(opt.config.as_deref(), opt.merge)
}
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct WikiConfig {
#[serde(
default = "WikiConfig::default_path",
deserialize_with = "utils::deserialize_absolute_path"
)]
pub path: PathBuf,
#[serde(default = "WikiConfig::default_name")]
pub name: Option<String>,
#[serde(default = "WikiConfig::default_diary_rel_path")]
pub diary_rel_path: PathBuf,
#[serde(default = "WikiConfig::default_ext")]
pub ext: String,
}
impl Default for WikiConfig {
fn default() -> Self {
Self {
path: Self::default_path(),
name: Self::default_name(),
diary_rel_path: Self::default_diary_rel_path(),
ext: Self::default_ext(),
}
}
}
impl WikiConfig {
#[inline]
pub fn default_path() -> PathBuf {
directories::UserDirs::new()
.map(|dirs| dirs.home_dir().to_path_buf())
.unwrap_or_else(|| {
let mut path = PathBuf::new();
path.push(Component::RootDir);
path
})
.join("vimwiki")
}
#[inline]
pub const fn default_name() -> Option<String> {
None
}
#[inline]
pub fn default_diary_rel_path() -> PathBuf {
PathBuf::from("diary")
}
#[inline]
pub fn default_ext() -> String {
String::from("wiki")
}
}