use std::collections::HashMap;
use bc_components::{Digest, DigestProvider};
use crate::{Envelope, Result};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Edges {
envelopes: HashMap<Digest, Envelope>,
}
impl Default for Edges {
fn default() -> Self { Self::new() }
}
impl Edges {
pub fn new() -> Self { Self { envelopes: HashMap::new() } }
pub fn add(&mut self, edge_envelope: Envelope) {
let digest = edge_envelope.digest();
self.envelopes.insert(digest, edge_envelope);
}
pub fn get(&self, digest: Digest) -> Option<&Envelope> {
self.envelopes.get(&digest)
}
pub fn remove(&mut self, digest: Digest) -> Option<Envelope> {
self.envelopes.remove(&digest)
}
pub fn clear(&mut self) { self.envelopes.clear(); }
pub fn is_empty(&self) -> bool { self.envelopes.is_empty() }
pub fn len(&self) -> usize { self.envelopes.len() }
pub fn iter(&self) -> impl Iterator<Item = (&Digest, &Envelope)> {
self.envelopes.iter()
}
pub fn add_to_envelope(&self, envelope: Envelope) -> Envelope {
let mut new_envelope = envelope;
for (_digest, edge_envelope) in self.envelopes.iter() {
new_envelope = new_envelope
.add_assertion(known_values::EDGE, edge_envelope.clone());
}
new_envelope
}
pub fn try_from_envelope(envelope: &Envelope) -> Result<Edges> {
let edge_envelopes = envelope.edges()?;
let mut edges = Edges::new();
for edge in edge_envelopes {
let digest = edge.digest();
edges.envelopes.insert(digest, edge);
}
Ok(edges)
}
}
#[allow(dead_code)]
pub trait Edgeable {
fn edges(&self) -> &Edges;
fn edges_mut(&mut self) -> &mut Edges;
fn add_edge(&mut self, edge_envelope: Envelope) {
self.edges_mut().add(edge_envelope);
}
fn get_edge(&self, digest: Digest) -> Option<&Envelope> {
self.edges().get(digest)
}
fn remove_edge(&mut self, digest: Digest) -> Option<Envelope> {
self.edges_mut().remove(digest)
}
fn clear_edges(&mut self) { self.edges_mut().clear(); }
fn has_edges(&self) -> bool { !self.edges().is_empty() }
}
use crate::known_values;