rotonda 0.5.2-alpha.0

composable, programmable BGP engine
Documentation
@(bgp_sessions: &BTreeMap<(Asn, IpAddr), Vec<(IngressId, IngressInfo)>>)

<table border="1px">
    @{
    let mut last_asn = Asn::from_u32(0);
    }
    @for ((asn, addr), sessions) in bgp_sessions.iter() {
    <tr>
        <td> @if asn != &last_asn {
            <a href="/routes/peer_asn/@asn">@asn</a>
            }</td>
        <td><a href="/routes/peer_ip/@addr">@addr</a></td>
        <td>
        @{ let mut iter = sessions.iter().peekable(); }
        @while iter.peek().is_some() {
            @{let (bgp_ingress_id, bgp_info) = iter.next().unwrap(); }
            @#(bgp_info.peer_rib_type.map(|e| 
                    format!("<a href=\"/routes/{bgp_ingress_id}\">{e}</a>")
                )
                .unwrap_or("no-rib-type (unexpected, bug?)".into())
            )
            @if iter.peek().is_some() {
                (<a href="/routes/diff/@bgp_ingress_id/@(iter.peek().unwrap().0)">vs</a>)
            }
            
        }

        </td>
    </tr>
    @{ last_asn = *asn; }
    }
    
</table>