use std::{env, fs, path::PathBuf};
use etcetera::BaseStrategy;
use crate::language::LanguageType;
use crate::sort::Sort;
use crate::stats::Report;
#[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>>,
#[serde(skip)]
pub for_each_fn: Option<fn(LanguageType, Report)>,
}
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 = etcetera::choose_base_strategy()
.ok()
.map(|basedirs| basedirs.config_dir())
.and_then(Self::get_config)
.unwrap_or_default();
let home_dir = etcetera::home_dir()
.ok()
.and_then(Self::get_config)
.unwrap_or_default();
let current_dir = env::current_dir()
.ok()
.and_then(Self::get_config)
.unwrap_or_default();
#[allow(clippy::or_fun_call)]
Config {
columns: current_dir
.columns
.or(home_dir.columns.or(conf_dir.columns)),
hidden: current_dir.hidden.or(home_dir.hidden.or(conf_dir.hidden)),
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)),
for_each_fn: current_dir
.for_each_fn
.or(home_dir.for_each_fn.or(conf_dir.for_each_fn)),
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)),
}
}
}