use std::env;
use std::fs::File;
use std::io::{ErrorKind, Result};
use std::path::{Path, PathBuf};
use codicon::Decoder;
use crate::certs::Chain;
fn append_rest<P: AsRef<Path>>(path: P) -> PathBuf {
let mut path = path.as_ref().to_path_buf();
path.push("amd-sev");
path.push("chain");
path
}
pub fn env_var() -> Option<PathBuf> {
env::var("SEV_CHAIN").ok().map(PathBuf::from)
}
pub fn home() -> Option<PathBuf> {
dirs::cache_dir().map(append_rest)
}
pub fn sys() -> Option<PathBuf> {
let sys = PathBuf::from("/var/cache");
if sys.exists() {
Some(append_rest(sys))
} else {
None
}
}
pub fn path() -> Vec<PathBuf> {
vec![env_var(), home(), sys()]
.into_iter()
.flatten()
.collect()
}
pub fn get() -> Result<Chain> {
let not_found: std::io::Error = ErrorKind::NotFound.into();
let paths: Vec<_> = path().into_iter().filter(|p| p.exists()).collect();
let file_name = paths.first().ok_or(not_found)?;
let mut file = File::open(file_name)?;
Chain::decode(&mut file, ())
}