use wot_network::{Certificate, Delegation as WotDelegation, TrustDepth};
use crate::types::certification::Certification;
#[cfg(doc)]
use crate::types::path::Path;
pub(crate) enum Edge {
Certification(Certification),
Delegation(Delegation),
ReverseEdge(ReverseEdge),
}
#[derive(Debug, Clone, Copy)]
pub enum UsedEdge {
Certification(usize),
Delegation(usize),
ReverseEdge { index: usize, path_id: usize },
}
impl UsedEdge {
pub fn is_reverse_edge(&self) -> bool {
matches!(self, UsedEdge::ReverseEdge { .. })
}
}
#[derive(Debug, Clone, Eq, Hash, PartialEq)]
pub(crate) struct ReverseEdge {
pub issuer: Certificate,
pub target: Certificate,
pub trust_amount: u8,
pub trust_depth: TrustDepth,
pub remaining_path_length: usize,
pub path_id: usize,
}
#[derive(Debug, Clone, Eq, Hash, PartialEq)]
pub(crate) struct Delegation {
pub inner: WotDelegation,
pub used_amount: u8,
}
impl Delegation {
pub fn new(inner: WotDelegation) -> Self {
Self {
inner,
used_amount: 0,
}
}
pub fn issuer(&self) -> &Certificate {
&self.inner.issuer
}
pub fn target(&self) -> &Certificate {
&self.inner.target
}
pub fn trust_amount(&self) -> u8 {
self.inner.trust_amount
}
pub fn trust_depth(&self) -> TrustDepth {
self.inner.trust_depth
}
pub fn regexes(&self) -> &Vec<wot_network::Regex> {
&self.inner.regexes
}
pub fn available_amount(&self) -> u8 {
self.inner.trust_amount.saturating_sub(self.used_amount)
}
}
#[derive(Debug, Clone, Eq, Hash, PartialEq)]
pub(crate) enum PathEdge {
ReverseEdge(ReverseEdge),
ForwardEdge(Delegation),
}
impl PathEdge {
pub fn reverse(&self) -> Option<&ReverseEdge> {
match self {
PathEdge::ReverseEdge(edge) => Some(edge),
_ => None,
}
}
pub fn delegation(&self) -> Option<&Delegation> {
match self {
PathEdge::ForwardEdge(delegation) => Some(delegation),
_ => None,
}
}
pub fn issuer(&self) -> &Certificate {
match self {
PathEdge::ReverseEdge(edge) => &edge.issuer,
PathEdge::ForwardEdge(delegation) => delegation.issuer(),
}
}
}