use wot_network::Certificate;
use crate::types::{certification::Certification, edges::PathEdge};
#[derive(Debug, Clone, Eq, Hash, PartialEq)]
pub(crate) struct Path {
pub trust_amount: u8,
pub trust_anchor: Certificate,
pub edges: Vec<PathEdge>,
pub certification: Certification,
}
impl Path {
#[allow(clippy::len_without_is_empty)]
pub fn len(&self) -> usize {
self.edges.len() + 1
}
pub fn simple_display(&self) -> String {
let mut output = String::new();
output.push_str(&format!("{}", self.trust_anchor));
for edge in &self.edges {
match edge {
PathEdge::ReverseEdge(reverse_edge) => {
output.push_str(&format!(" ┄⇢ {}", reverse_edge.target))
}
PathEdge::ForwardEdge(delegation) => {
output.push_str(&format!(" → {}", delegation.target()))
}
}
}
output.push_str(&format!(
" ⇒ ({}, {})",
self.certification.inner.target_cert(),
self.certification.inner.target_id(),
));
output
}
pub fn simple_display_without_anchor(&self) -> String {
let mut output = String::new();
let mut edges_iter = self.edges.iter().peekable();
if let Some(first_edge) = edges_iter.peek() {
output.push_str(&format!("{}", first_edge.issuer()))
}
for edge in &self.edges {
match edge {
PathEdge::ReverseEdge(reverse_edge) => {
output.push_str(&format!(" ┄⇢ {}", reverse_edge.target))
}
PathEdge::ForwardEdge(delegation) => {
output.push_str(&format!(" → {}", delegation.target()))
}
}
}
output.push_str(&format!(
" ⇒ ({}, {})",
self.certification.inner.target_cert(),
self.certification.inner.target_id(),
));
output
}
pub fn simple_display_without_target(&self) -> String {
let mut output = String::new();
output.push_str(&format!("{}", self.trust_anchor));
for edge in &self.edges {
match edge {
PathEdge::ReverseEdge(reverse_edge) => {
output.push_str(&format!(" ┄⇢ {}", reverse_edge.target))
}
PathEdge::ForwardEdge(delegation) => {
output.push_str(&format!(" → {}", delegation.target()))
}
}
}
output
}
}