impl RoadmapService {
#[provable_contracts_macros::contract("pmat-core.yaml", equation = "check_compliance")]
pub fn upsert_item(&self, item: RoadmapItem) -> Result<()> {
let _lock = self.acquire_write_lock()?;
let mut roadmap = if self.roadmap_path.exists() {
let contents = fs::read_to_string(&self.roadmap_path)
.with_context(|| format!("Failed to read roadmap file: {:?}", self.roadmap_path))?;
self.parse_roadmap_yaml(&contents)?
} else {
Roadmap::default()
};
roadmap.upsert_item(item);
if let Some(parent) = self.roadmap_path.parent() {
fs::create_dir_all(parent)
.with_context(|| format!("Failed to create directory: {:?}", parent))?;
}
let yaml = serde_yaml_ng::to_string(&roadmap)
.with_context(|| "Failed to serialize roadmap to YAML")?;
fs::write(&self.roadmap_path, yaml)
.with_context(|| format!("Failed to write roadmap file: {:?}", self.roadmap_path))?;
Ok(())
}
#[provable_contracts_macros::contract("pmat-core.yaml", equation = "check_compliance")]
pub fn remove_item(&self, id: &str) -> Result<Option<RoadmapItem>> {
let _lock = self.acquire_write_lock()?;
let mut roadmap = if self.roadmap_path.exists() {
let contents = fs::read_to_string(&self.roadmap_path)
.with_context(|| format!("Failed to read roadmap file: {:?}", self.roadmap_path))?;
self.parse_roadmap_yaml(&contents)?
} else {
Roadmap::default()
};
let removed = roadmap.remove_item(id);
if let Some(parent) = self.roadmap_path.parent() {
fs::create_dir_all(parent)
.with_context(|| format!("Failed to create directory: {:?}", parent))?;
}
let yaml = serde_yaml_ng::to_string(&roadmap)
.with_context(|| "Failed to serialize roadmap to YAML")?;
fs::write(&self.roadmap_path, yaml)
.with_context(|| format!("Failed to write roadmap file: {:?}", self.roadmap_path))?;
Ok(removed)
}
#[provable_contracts_macros::contract("pmat-core.yaml", equation = "check_compliance")]
pub fn find_item(&self, id: &str) -> Result<Option<RoadmapItem>> {
let roadmap = self.load()?;
Ok(roadmap.find_item(id).cloned())
}
#[provable_contracts_macros::contract("pmat-core.yaml", equation = "check_compliance")]
pub fn find_item_by_github_issue(&self, issue: u64) -> Result<Option<RoadmapItem>> {
let roadmap = self.load()?;
Ok(roadmap.find_item_by_github_issue(issue).cloned())
}
#[provable_contracts_macros::contract("pmat-core.yaml", equation = "path_exists")]
pub fn path(&self) -> &Path {
&self.roadmap_path
}
#[provable_contracts_macros::contract("pmat-core.yaml", equation = "check_compliance")]
pub fn exists(&self) -> bool {
self.roadmap_path.exists()
}
#[provable_contracts_macros::contract("pmat-core.yaml", equation = "check_compliance")]
pub fn initialize(&self, github_repo: Option<String>) -> Result<()> {
let roadmap = Roadmap::new(github_repo);
self.save(&roadmap)?;
Ok(())
}
}