use std::collections::HashMap;
use bc_components::{Digest, DigestProvider};
use crate::{Envelope, EnvelopeEncodable, Result};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Attachments {
envelopes: HashMap<Digest, Envelope>,
}
impl Default for Attachments {
fn default() -> Self { Self::new() }
}
impl Attachments {
pub fn new() -> Self { Self { envelopes: HashMap::new() } }
pub fn add(
&mut self,
payload: impl EnvelopeEncodable,
vendor: impl AsRef<str>,
conforms_to: Option<impl AsRef<str>>,
) {
let attachment = Envelope::new_attachment(
payload,
vendor.as_ref(),
conforms_to.as_ref().map(|s| s.as_ref()),
);
self.envelopes.insert(attachment.digest(), attachment);
}
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 add_to_envelope(&self, envelope: Envelope) -> Envelope {
let mut new_envelope = envelope;
for (_digest, envelope) in self.envelopes.iter() {
new_envelope =
new_envelope.add_assertion_envelope(envelope).unwrap();
}
new_envelope
}
pub fn try_from_envelope(envelope: &Envelope) -> Result<Attachments> {
let attachment_envelopes = envelope.attachments()?;
let mut attachments = Attachments::new();
for attachment in attachment_envelopes {
let digest = attachment.digest();
attachments.envelopes.insert(digest, attachment);
}
Ok(attachments)
}
}
#[allow(dead_code)]
pub trait Attachable {
fn attachments(&self) -> &Attachments;
fn attachments_mut(&mut self) -> &mut Attachments;
fn add_attachment(
&mut self,
payload: impl EnvelopeEncodable,
vendor: &str,
conforms_to: Option<&str>,
) {
self.attachments_mut().add(payload, vendor, conforms_to);
}
fn get_attachment(&self, digest: Digest) -> Option<&Envelope> {
self.attachments().get(digest)
}
fn remove_attachment(&mut self, digest: Digest) -> Option<Envelope> {
self.attachments_mut().remove(digest)
}
fn clear_attachments(&mut self) { self.attachments_mut().clear(); }
fn has_attachments(&self) -> bool { !self.attachments().is_empty() }
}