//! Journal d'audit d'une mutation. Une mutation sans trace n'a pas eu lieu. use crate::mutation::{Mutation, MutationId}; pub struct AuditEntry { pub id: MutationId, pub parent: Option, pub issue: Option, pub applied_at: SystemTime, } /// Une mutation doit citer l'issue qui la justifie. Sans ce lien, le runtime /// refuse d'appliquer : personne ne doit pouvoir dire "je ne sais plus /// pourquoi ce code a change". pub fn accept(m: &Mutation) -> Result { let issue = m.linked_issue().ok_or(AuditError::NoLinkedIssue)?; if m.touches_immutable_set() { return Err(AuditError::ImmutablePath(m.first_immutable_path())); } Ok(AuditEntry { id: m.id(), parent: m.parent(), issue: Some(issue), applied_at: SystemTime::now(), }) } /// Le rollback est une nouvelle entree, jamais une suppression : la chaine /// doit rester lisible d'un bout a l'autre. pub fn rollback(entry: &AuditEntry) -> AuditEntry { AuditEntry { id: MutationId::new(), parent: Some(entry.id), issue: entry.issue.clone(), applied_at: SystemTime::now(), } }