use affinidi_data_integrity::DataIntegrityProof;
use serde::{Deserialize, Serialize};
use crate::DIDWebVHError;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WitnessProofCollection(pub Vec<WitnessProof>);
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WitnessProof {
pub version_id: String,
pub proof: Vec<DataIntegrityProof>,
}
impl WitnessProofCollection {
pub fn add_proof(
&mut self,
version_id: &str,
proof: &DataIntegrityProof,
) -> Result<(), DIDWebVHError> {
if let Some(record) = self.0.iter_mut().find(|p| p.version_id == version_id) {
record.proof.push(proof.to_owned());
} else {
self.0.push(WitnessProof {
version_id: version_id.to_string(),
proof: vec![proof.to_owned()],
});
}
Ok(())
}
pub fn remove_version_id(&mut self, version_id: &str) {
self.0.retain(|p| p.version_id != version_id);
}
pub fn get_proof_count(&self, version_id: &str) -> usize {
self.0
.iter()
.find(|p| p.version_id == version_id)
.map_or(0, |p| p.proof.len())
}
pub fn save_to_file(&self, file_path: &str) -> Result<(), DIDWebVHError> {
let json_data = serde_json::to_string(self).map_err(|e| {
DIDWebVHError::WitnessProofError(format!(
"Couldn't serialize Witness Proofs Data: {}",
e
))
})?;
std::fs::write(file_path, json_data).map_err(|e| {
DIDWebVHError::WitnessProofError(format!(
"Couldn't write to Witness Proofs file ({}): {}",
file_path, e
))
})?;
Ok(())
}
}