1use std::path::{Path, PathBuf};
2
3pub fn cache_root_for_cwd(cwd: &Path) -> PathBuf {
4 cwd.join(".kg").join("cache")
5}
6
7pub fn cache_root_for_graph(graph_path: &Path) -> PathBuf {
8 if let Some(root) = detect_kg_root_for_graph(graph_path) {
9 return root.join("cache");
10 }
11 graph_path
12 .parent()
13 .map(|parent| parent.join(".kg").join("cache"))
14 .unwrap_or_else(|| PathBuf::from(".kg").join("cache"))
15}
16
17fn detect_kg_root_for_graph(graph_path: &Path) -> Option<PathBuf> {
18 let mut current = graph_path.parent();
19 while let Some(dir) = current {
20 if dir.file_name().and_then(|name| name.to_str()) == Some("graphs")
21 && dir
22 .parent()
23 .and_then(|parent| parent.file_name())
24 .and_then(|name| name.to_str())
25 == Some(".kg")
26 {
27 return dir.parent().map(Path::to_path_buf);
28 }
29 current = dir.parent();
30 }
31 None
32}