impl TicketFile {
#[provable_contracts_macros::contract("pmat-core.yaml", equation = "path_exists")]
pub fn from_file(path: &Path) -> Result<Self> {
let content = std::fs::read_to_string(path)?;
let mut ticket = Self::parse_content(&content)?;
ticket.file_path = path.to_path_buf();
Ok(ticket)
}
#[provable_contracts_macros::contract("pmat-core.yaml", equation = "check_compliance")]
pub fn parse_content(content: &str) -> Result<Self> {
let lines: Vec<&str> = content.lines().collect();
let header = lines
.first()
.ok_or_else(|| TicketError::ParseError("Empty ticket file".into()))?;
let (id, title) = parse_header(header)?;
let status = extract_metadata(&lines, "**Status**")?;
let priority = extract_metadata(&lines, "**Priority**")?;
let complexity_str = extract_metadata(&lines, "**Complexity**")?;
let estimated_time = extract_metadata(&lines, "**Estimated Time**")?;
let dependencies_str = extract_metadata(&lines, "**Dependencies**")?;
let sprint = extract_metadata(&lines, "**Sprint**")?;
let status = parse_status(&status)?;
let priority = parse_priority(&priority)?;
let complexity = parse_complexity(&complexity_str)?;
let dependencies = parse_dependencies(&dependencies_str);
let objective = extract_section(&lines, "## Objective")?;
let success_criteria = extract_checklist(&lines, "## Success Criteria")?;
Ok(TicketFile {
id,
title,
status,
priority,
complexity,
estimated_time,
dependencies,
sprint,
objective,
success_criteria,
file_path: PathBuf::new(),
})
}
#[provable_contracts_macros::contract("pmat-core.yaml", equation = "check_compliance")]
pub fn validate(&self) -> Result<()> {
if !self.id.starts_with("TICKET-PMAT-") {
return Err(TicketError::ParseError(format!(
"Invalid ticket ID: {}",
self.id
)));
}
if self.complexity < 1 || self.complexity > 10 {
return Err(TicketError::InvalidComplexity(self.complexity));
}
if self.objective.trim().is_empty() {
return Err(TicketError::MissingField("Objective".into()));
}
if self.success_criteria.is_empty() {
return Err(TicketError::MissingField("Success Criteria".into()));
}
Ok(())
}
}