bc_envelope/extension/edge/
edges.rs1use std::collections::HashMap;
2
3use bc_components::{Digest, DigestProvider};
4
5use crate::{Envelope, Result};
6
7#[derive(Debug, Clone, PartialEq, Eq)]
13pub struct Edges {
14 envelopes: HashMap<Digest, Envelope>,
15}
16
17impl Default for Edges {
18 fn default() -> Self { Self::new() }
19}
20
21impl Edges {
22 pub fn new() -> Self { Self { envelopes: HashMap::new() } }
24
25 pub fn add(&mut self, edge_envelope: Envelope) {
27 let digest = edge_envelope.digest();
28 self.envelopes.insert(digest, edge_envelope);
29 }
30
31 pub fn get(&self, digest: Digest) -> Option<&Envelope> {
33 self.envelopes.get(&digest)
34 }
35
36 pub fn remove(&mut self, digest: Digest) -> Option<Envelope> {
38 self.envelopes.remove(&digest)
39 }
40
41 pub fn clear(&mut self) { self.envelopes.clear(); }
43
44 pub fn is_empty(&self) -> bool { self.envelopes.is_empty() }
46
47 pub fn len(&self) -> usize { self.envelopes.len() }
49
50 pub fn iter(&self) -> impl Iterator<Item = (&Digest, &Envelope)> {
52 self.envelopes.iter()
53 }
54
55 pub fn add_to_envelope(&self, envelope: Envelope) -> Envelope {
57 let mut new_envelope = envelope;
58 for (_digest, edge_envelope) in self.envelopes.iter() {
59 new_envelope = new_envelope
60 .add_assertion(known_values::EDGE, edge_envelope.clone());
61 }
62 new_envelope
63 }
64
65 pub fn try_from_envelope(envelope: &Envelope) -> Result<Edges> {
67 let edge_envelopes = envelope.edges()?;
68 let mut edges = Edges::new();
69 for edge in edge_envelopes {
70 let digest = edge.digest();
71 edges.envelopes.insert(digest, edge);
72 }
73 Ok(edges)
74 }
75}
76
77#[allow(dead_code)]
83pub trait Edgeable {
84 fn edges(&self) -> &Edges;
86
87 fn edges_mut(&mut self) -> &mut Edges;
89
90 fn add_edge(&mut self, edge_envelope: Envelope) {
92 self.edges_mut().add(edge_envelope);
93 }
94
95 fn get_edge(&self, digest: Digest) -> Option<&Envelope> {
97 self.edges().get(digest)
98 }
99
100 fn remove_edge(&mut self, digest: Digest) -> Option<Envelope> {
102 self.edges_mut().remove(digest)
103 }
104
105 fn clear_edges(&mut self) { self.edges_mut().clear(); }
107
108 fn has_edges(&self) -> bool { !self.edges().is_empty() }
110}
111
112use crate::known_values;