| 121 | } |
| 122 | |
| 123 | pub fn read_enrollment_marker(project_root: &Path) -> Result<Option<EnrollmentMarker>> { |
| 124 | let path = enrollment_marker_path(project_root); |
| 125 | if !path.is_file() { |
| 126 | return Ok(None); |
| 127 | } |
| 128 | let text = fs::read_to_string(&path).map_err(|e| TraceDecayError::Config { |
| 129 | message: format!("failed to read enrollment marker '{}': {e}", path.display()), |
| 130 | })?; |
| 131 | let marker = serde_json::from_str(&text).map_err(|e| TraceDecayError::Config { |
| 132 | message: format!( |
| 133 | "failed to parse enrollment marker '{}': {e}", |
| 134 | path.display() |
| 135 | ), |
| 136 | })?; |
| 137 | validate_enrollment_marker(&marker, &path)?; |
| 138 | Ok(Some(marker)) |
| 139 | } |
| 140 | |
| 141 | pub fn write_enrollment_marker(project_root: &Path, marker: &EnrollmentMarker) -> Result<()> { |
| 142 | validate_enrollment_marker(marker, &enrollment_marker_path(project_root))?; |