use crate::helpers::with_metadata_hashable::{WithMetadataHashable, WithMetadataHashableFields};
use crate::structs::{Observation, ObservationMetadata, ObservationProof, Proof};
use crate::{util, Hash, HashClear, StructMetadata};
use itertools::Itertools;
impl HashClear for ObservationMetadata {
fn hash_clear(&mut self) {
if let Some(s) = self.struct_metadata.as_mut() {
s.hash_clear();
}
}
}
impl WithMetadataHashableFields for ObservationMetadata {
fn struct_metadata_opt(&mut self) -> Option<&mut StructMetadata> {
self.struct_metadata.as_mut()
}
fn struct_metadata_opt_ref(&self) -> Option<&StructMetadata> {
self.struct_metadata.as_ref()
}
}
impl Observation {
pub fn leafs(&self) -> Vec<Vec<u8>> {
self.observations
.iter()
.map(| r| r.clone().hash_proto_bytes())
.collect::<Vec<Vec<u8>>>()
}
pub fn leafs_hash(&self) -> Vec<Hash> {
self.observations
.iter()
.map(|r| r.hash_or())
.collect_vec()
}
pub fn leafs_vec(&self) -> Vec<Vec<u8>> {
self.leafs()
.iter()
.map(|r| r.to_vec())
.collect::<Vec<Vec<u8>>>()
}
pub fn build_observation_proofs(&self, obs_tx_hash: &Hash, proof: &Proof) -> Vec<ObservationProof> {
let mut res = vec![];
let leafs = self.leafs_hash();
let merkle_tree = util::merkle::build_root(leafs.clone()).expect("merkle failure");
for observation_metadata in &self.observations {
let hash = observation_metadata.hash_or();
let merkle_proof = merkle_tree.proof(hash.clone());
let mut op = ObservationProof::default();
op.metadata = Some(observation_metadata.clone());
op.merkle_proof = Some(merkle_proof);
op.proof = Some(proof.clone());
op.observation_hash = Some(obs_tx_hash.clone());
res.push(op);
};
res
}
}