use serde::{Deserialize, Serialize};
use crate::{
DIDWebVHError,
log_entry::{LogEntry, MetaData},
parameters::Parameters,
};
#[derive(Clone, Debug, Default, Deserialize, PartialEq, Serialize)]
pub enum LogEntryValidationStatus {
Invalid(String),
#[default]
NotValidated,
LogEntryOnly,
WitnessProof,
Ok,
}
#[derive(Debug)]
pub struct LogEntryState {
pub log_entry: LogEntry,
pub metadata: MetaData,
pub version_number: u32,
pub validated_parameters: Parameters,
pub validation_status: LogEntryValidationStatus,
}
impl LogEntryState {
pub fn verify_log_entry(
&mut self,
previous_log_entry: Option<&LogEntryState>,
) -> Result<(), DIDWebVHError> {
if self.validation_status == LogEntryValidationStatus::Ok {
return Ok(());
}
let (parameters, metadata) = self.log_entry.verify_log_entry(
previous_log_entry.map(|e| &e.log_entry),
previous_log_entry.map(|e| &e.validated_parameters),
previous_log_entry.map(|e| &e.metadata),
)?;
self.validated_parameters = parameters;
self.metadata = metadata;
self.validation_status = LogEntryValidationStatus::LogEntryOnly;
Ok(())
}
pub fn get_version_number(&self) -> u32 {
self.version_number
}
}