use std::collections::VecDeque;
use crate::network::scion::{
segment::model::LinkSegment,
topology::{DirectedScionLink, ScionAs, ScionGlobalInterfaceId, ScionLinkType, ScionTopology},
};
pub fn parse_segment(s: &str, use_link_type: ScionLinkType) -> anyhow::Result<LinkSegment> {
use std::str::FromStr;
use anyhow::bail;
let mut hops = VecDeque::new();
for entry in s.split(';').map(str::trim).filter(|s| !s.is_empty()) {
let parts: Vec<&str> = entry.split("->").map(str::trim).collect();
if parts.len() != 2 {
bail!("Invalid path entry: {}", entry);
}
let from = ScionGlobalInterfaceId::from_str(parts[0])?;
let to = ScionGlobalInterfaceId::from_str(parts[1])?;
hops.push_back(DirectedScionLink {
from,
to,
link_type: use_link_type,
});
}
Ok(LinkSegment {
start_as: hops.front().unwrap().from.isd_as,
end_as: hops.back().unwrap().to.isd_as,
links: hops,
})
}
pub fn test_topology() -> anyhow::Result<ScionTopology> {
let mut topo = ScionTopology::new();
topo.add_as(ScionAs::new_core("1-1".parse()?))?
.add_as(ScionAs::new("1-2".parse()?))?
.add_as(ScionAs::new("1-3".parse()?))?
.add_as(ScionAs::new("1-4".parse()?))?
.add_as(ScionAs::new_core("1-11".parse()?))?
.add_as(ScionAs::new("1-12".parse()?))?
.add_as(ScionAs::new_core("1-21".parse()?))?
.add_as(ScionAs::new_core("2-1".parse()?))?
.add_as(ScionAs::new("2-2".parse()?))?
.add_as(ScionAs::new("2-3".parse()?))?
.add_as(ScionAs::new("2-21".parse()?))?;
topo.add_link("1-1#5 core 1-11#6".parse()?)?
.add_link("1-1#32 core 1-21#17".parse()?)?
.add_link("1-11#15 core 1-21#22".parse()?)?
.add_link("1-21#23 core 2-1#24".parse()?)?
.add_link("1-11#23 core 2-1#1".parse()?)?;
topo.add_link("1-1#1 down_to 1-2#2".parse()?)?
.add_link("1-2#3 down_to 1-3#4".parse()?)?
.add_link("1-3#15 down_to 1-4#16".parse()?)?
.add_link("1-2#17 down_to 1-4#18".parse()?)?;
topo.add_link("1-11#7 down_to 1-12#8".parse()?)?
.add_link("1-12#9 down_to 1-3#10".parse()?)?
.add_link("1-12#19 down_to 1-4#20".parse()?)?
.add_link("1-12#12 down_to 1-2#11 ".parse()?)?;
topo.add_link("2-1#2 down_to 2-2#3".parse()?)?
.add_link("2-2#4 down_to 2-3#5".parse()?)?
.add_link("2-3#6 up_to 2-21#7".parse()?)?
.add_link("2-2#52 down_to 2-21#2".parse()?)?;
topo.add_link("1-3#53 peer 2-2#22".parse()?)?;
Ok(topo)
}