use std::collections::HashMap;
use crate::{Binding, Certificate, Certification, Delegation, Regex, TrustDepth};
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, PartialEq, Clone)]
pub struct Network {
pub certifications: HashMap<Binding, Vec<Certification>>,
pub delegations: HashMap<Certificate, Vec<Delegation>>,
}
impl Default for Network {
fn default() -> Self {
Self::new()
}
}
impl Network {
pub fn new() -> Self {
Self {
certifications: Default::default(),
delegations: Default::default(),
}
}
pub fn num_edges(&self) -> usize {
self.certifications.len() + self.delegations.len()
}
pub fn add_binding(&mut self, issuer: Certificate, target: Binding) {
let edge = Certification {
issuer: issuer.clone(),
target: target.clone(),
};
if let Some(edges) = self.certifications.get_mut(&Binding {
cert: target.cert.clone(),
identity: target.identity.clone(),
}) {
edges.push(edge);
} else {
let list = vec![edge];
self.certifications.insert(
Binding {
cert: target.cert,
identity: target.identity,
},
list,
);
}
}
pub fn add_delegation(
&mut self,
issuer: Certificate,
target_cert: Certificate,
trust_amount: u8,
trust_depth: TrustDepth,
regexes: Vec<Regex>,
) {
let edge = Delegation {
issuer: issuer.clone(),
target: target_cert.clone(),
trust_amount,
trust_depth,
regexes,
};
if let Some(edges) = self.delegations.get_mut(&target_cert) {
edges.push(edge);
} else {
let list = vec![edge];
self.delegations.insert(target_cert, list);
}
}
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone)]
pub struct MinimalNetwork {
pub certifications: Vec<Certification>,
pub delegations: Vec<Delegation>,
}
impl From<Network> for MinimalNetwork {
fn from(network: Network) -> Self {
let certifications = network.certifications.into_values().flatten().collect();
let delegations = network.delegations.into_values().flatten().collect();
MinimalNetwork {
certifications,
delegations,
}
}
}
impl From<MinimalNetwork> for Network {
fn from(minimal_network: MinimalNetwork) -> Self {
let mut certifications: HashMap<Binding, Vec<Certification>> = HashMap::new();
for cert in minimal_network.certifications {
certifications
.entry(cert.target.clone())
.or_default()
.push(cert);
}
let mut delegations: HashMap<Certificate, Vec<Delegation>> = HashMap::new();
for delegation in minimal_network.delegations {
delegations
.entry(delegation.target.clone())
.or_default()
.push(delegation);
}
Network {
certifications,
delegations,
}
}
}