use serde::{Deserialize, Serialize};
use std::{
collections::{BTreeSet, HashMap},
fs,
path::{Path, PathBuf},
};
#[derive(Serialize, Deserialize, Default)]
pub struct DepGraph {
pub objects: HashMap<PathBuf, Vec<PathBuf>>,
}
impl DepGraph {
fn path(dir: &Path, profile: &str) -> PathBuf {
dir
.join(".conjure")
.join("build")
.join("objdeps")
.join(format!("{profile}.kdl"))
}
pub fn files(&self) -> Vec<PathBuf> {
let mut set: BTreeSet<PathBuf> = BTreeSet::new();
for deps in self.objects.values() {
set.extend(deps.iter().cloned());
}
set.into_iter().collect()
}
pub fn load(dir: &Path, profile: &str) -> Self {
fs::read_to_string(Self::path(dir, profile))
.ok()
.and_then(|s| kdl::de::from_str(&s).ok())
.unwrap_or_default()
}
pub fn save(&self, dir: &Path, profile: &str) {
let path = Self::path(dir, profile);
let _ = fs::create_dir_all(path.parent().unwrap());
if let Ok(mut doc) = kdl::se::to_document(self) {
let cfg = kdl::FormatConfigBuilder::new().indent(" ").build();
doc.autoformat_config(&cfg);
let _ = fs::write(path, super::proj_write::fix_braces(&doc.to_string()));
}
}
}