use crate::{
config::{code::Code, cookies::Cookies, storage::Storage, sys::Sys},
Error, Result,
};
use serde::{Deserialize, Serialize};
use std::{fs, path::Path};
mod code;
mod cookies;
mod storage;
mod sys;
pub use cookies::LeetcodeSite;
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
pub struct Config {
#[serde(default, skip_serializing)]
pub sys: Sys,
pub code: Code,
pub cookies: Cookies,
pub storage: Storage,
}
impl Config {
fn write_default(p: impl AsRef<Path>) -> Result<()> {
fs::write(p.as_ref(), toml::ser::to_string_pretty(&Self::default())?)?;
Ok(())
}
pub fn locate() -> Result<Config> {
let conf = Self::root()?.join("leetcode.toml");
if !conf.is_file() {
Self::write_default(&conf)?;
}
let s = fs::read_to_string(&conf)?;
match toml::from_str::<Config>(&s) {
Ok(config) => match config.cookies.site {
cookies::LeetcodeSite::LeetcodeCom => Ok(config),
cookies::LeetcodeSite::LeetcodeCn => {
let mut config = config;
config.sys.urls = sys::Urls::new_with_leetcode_cn();
Ok(config)
}
},
Err(e) => {
let tmp = Self::root()?.join("leetcode.tmp.toml");
Self::write_default(tmp)?;
Err(e.into())
}
}
}
pub fn root() -> Result<std::path::PathBuf> {
let dir = dirs::home_dir().ok_or(Error::NoneError)?.join(".leetcode");
if !dir.is_dir() {
info!("Generate root dir at {:?}.", &dir);
fs::DirBuilder::new().recursive(true).create(&dir)?;
}
Ok(dir)
}
pub fn sync(&self) -> Result<()> {
let home = dirs::home_dir().ok_or(Error::NoneError)?;
let conf = home.join(".leetcode/leetcode.toml");
fs::write(conf, toml::ser::to_string_pretty(&self)?)?;
Ok(())
}
}