use std::{env, fs, path::PathBuf};
use crate::language::LanguageType;
use crate::sort::Sort;
#[derive(Debug, Default, Deserialize)]
pub struct Config {
pub columns: Option<usize>,
pub hidden: Option<bool>,
pub no_ignore: Option<bool>,
pub no_ignore_parent: Option<bool>,
pub no_ignore_dot: Option<bool>,
pub no_ignore_vcs: Option<bool>,
pub treat_doc_strings_as_comments: Option<bool>,
pub sort: Option<Sort>,
pub types: Option<Vec<LanguageType>>,
}
impl Config {
fn get_config(base: PathBuf) -> Option<Self> {
fs::read_to_string(base.join("tokei.toml"))
.ok()
.or_else(|| fs::read_to_string(base.join(".tokeirc")).ok())
.and_then(|s| toml::from_str(&s).ok())
}
pub fn from_config_files() -> Self {
let conf_dir = dirs::config_dir()
.and_then(Self::get_config)
.unwrap_or_else(Self::default);
let home_dir = dirs::home_dir()
.and_then(Self::get_config)
.unwrap_or_else(Self::default);
let current_dir = env::current_dir()
.ok()
.and_then(Self::get_config)
.unwrap_or_else(Self::default);
#[allow(clippy::or_fun_call)]
Config {
columns: current_dir
.columns
.or(home_dir.columns.or(conf_dir.columns)),
treat_doc_strings_as_comments: current_dir.treat_doc_strings_as_comments.or(home_dir
.treat_doc_strings_as_comments
.or(conf_dir.treat_doc_strings_as_comments)),
sort: current_dir.sort.or(home_dir.sort.or(conf_dir.sort)),
types: current_dir.types.or(home_dir.types.or(conf_dir.types)),
no_ignore: current_dir
.no_ignore
.or(home_dir.no_ignore.or(conf_dir.no_ignore)),
no_ignore_parent: current_dir
.no_ignore_parent
.or(home_dir.no_ignore_parent.or(conf_dir.no_ignore_parent)),
no_ignore_dot: current_dir
.no_ignore_dot
.or(home_dir.no_ignore_dot.or(conf_dir.no_ignore_dot)),
no_ignore_vcs: current_dir
.no_ignore_vcs
.or(home_dir.no_ignore_vcs.or(conf_dir.no_ignore_vcs)),
..Self::default()
}
}
}