use std::path::PathBuf;
use dirs::home_dir;
const PH_HOME_ENV_VAR: &str = "PH_HOME";
#[derive(Clone, Debug)]
pub struct Cache {
path: PathBuf,
}
impl Cache {
pub fn new(path: PathBuf) -> Self {
Self { path }
}
pub fn from_env() -> Self {
match std::env::var(PH_HOME_ENV_VAR) {
Ok(home) => {
let mut path: PathBuf = home.into();
path.push("hub");
Self::new(path)
}
Err(_) => Self::default(),
}
}
pub fn path(&self) -> &PathBuf {
&self.path
}
pub fn token_path(&self) -> PathBuf {
let mut path = self.path.clone();
path.pop();
path.push("token");
path
}
pub fn token(&self) -> Option<String> {
let token_filename = self.token_path();
match std::fs::read_to_string(token_filename) {
Ok(token_content) => {
let token_content = token_content.trim();
if token_content.is_empty() {
None
} else {
Some(token_content.to_string())
}
}
Err(_) => None,
}
}
}
impl Default for Cache {
fn default() -> Self {
let mut path = home_dir().expect("Cache directory cannot be found");
path.push(".cache");
path.push("pephub");
path.push("hub");
Self::new(path)
}
}