1use std::path::PathBuf;
4
5use crate::{error, variables};
6
7#[derive(Clone, Default)]
9#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
10pub struct PathCache {
11 cache: std::collections::HashMap<String, PathBuf>,
13}
14
15impl PathCache {
16 pub fn reset(&mut self) {
18 self.cache.clear();
19 }
20
21 pub fn get<S: AsRef<str>>(&self, name: S) -> Option<PathBuf> {
27 self.cache.get(name.as_ref()).cloned()
28 }
29
30 pub fn set<T: Into<String>>(&mut self, name: T, path: PathBuf) {
37 self.cache.insert(name.into(), path);
38 }
39
40 pub fn to_value(&self) -> Result<variables::ShellValue, error::Error> {
42 let pairs = self
43 .cache
44 .iter()
45 .map(|(k, v)| (Some(k.to_owned()), v.to_string_lossy().to_string()))
46 .collect::<Vec<_>>();
47
48 variables::ShellValue::associative_array_from_literals(variables::ArrayLiteral(pairs))
49 }
50
51 pub fn unset<S: AsRef<str>>(&mut self, name: S) -> bool {
58 self.cache.remove(name.as_ref()).is_some()
59 }
60}