use config::Config;
use failure::Error;
use lazy_static::lazy_static;
use serde::Deserialize;
use std::{convert::Into, env, path::PathBuf, sync::RwLock};
use which::which_in;
lazy_static! {
static ref CONFIG: RwLock<Config> = RwLock::new(Config::default());
}
pub fn adb() -> Result<PathBuf, Error> {
which_in("adb", env::var_os("PATH"), env::current_dir()?).map_err(Into::into)
}
pub fn terminal_width() -> Option<usize> {
match term_size::dimensions() {
Some((width, _)) => Some(width),
None => env::var("COLUMNS")
.ok()
.and_then(|e| e.parse::<usize>().ok()),
}
}
pub fn config_dir() -> PathBuf {
directories::BaseDirs::new()
.unwrap()
.config_dir()
.join("rogcat")
}
pub fn config_get<'a, T: Deserialize<'a>>(key: &'a str) -> Option<T> {
CONFIG.read().ok().and_then(|c| c.get::<T>(key).ok())
}
pub fn config_init() {
let config_file = config_dir().join("config.toml");
CONFIG
.write()
.expect("Failed to get config lock")
.merge(config::File::from(config_file))
.ok();
}