use std::{env::current_dir, fmt::Display};
use crate::io::file;
use anyhow::Result;
use home::home_dir;
use serde_derive::{Deserialize, Serialize};
#[derive(Debug, Deserialize, Serialize)]
pub struct Config {
pub notes_dir: String,
pub metadata_dir: String,
pub file_format: String,
}
impl Display for Config {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"notes directory: {}\nmetadata directory: {}\nfile format: {}",
self.notes_dir, self.metadata_dir, self.file_format
)
}
}
pub enum WEnv {
Prod,
Test,
}
impl WEnv {
fn config_base_dir(&self) -> String {
match self {
Self::Prod => home_dir().unwrap().display().to_string(),
Self::Test => current_dir().unwrap().display().to_string(),
}
}
fn wikio_base_dir(&self) -> String {
match self {
Self::Prod => home_dir().unwrap().display().to_string(),
Self::Test => current_dir().unwrap().display().to_string(),
}
}
fn config_dir(&self) -> String {
match self {
Self::Prod => ".config/wiki-o".to_string(),
Self::Test => "test-dir/config".to_string(),
}
}
pub fn config(&self) -> Config {
match self {
Self::Prod => Config {
notes_dir: "wiki-o/notes".to_string(),
metadata_dir: "wiki-o/_metadata".to_string(),
file_format: String::from("md"),
},
Self::Test => Config {
notes_dir: "test-dir/notes".to_string(),
metadata_dir: "test-dir/_metadata".to_string(),
file_format: String::from("md"),
},
}
}
pub fn notes_abs_dir(&self) -> String {
format!("{}/{}", self.wikio_base_dir(), self.config().notes_dir)
}
pub fn metadata_abs_dir(&self) -> String {
format!("{}/{}", self.wikio_base_dir(), self.config().metadata_dir)
}
}
pub struct ContextWriter {
pub env: WEnv,
}
impl ContextWriter {
pub fn init(&self) -> Result<()> {
self.create_config_dir()?;
self.create_dir_if_not_exist()?;
Ok(())
}
fn create_config_dir(&self) -> Result<()> {
file::create_dir_if_not_exist(&format!(
"{}/{}",
self.env.config_base_dir(),
self.env.config_dir()
))?;
Ok(())
}
fn create_dir_if_not_exist(&self) -> Result<()> {
file::create_dir_if_not_exist(&self.env.notes_abs_dir())?;
file::create_dir_if_not_exist(&self.env.metadata_abs_dir())?;
Ok(())
}
}