mod geo_peer_table;
mod peer_index_table;
mod rib_afi_entries;
use crate::error::ParserError;
use crate::messages::table_dump_v2::geo_peer_table::parse_geo_peer_table;
use crate::messages::table_dump_v2::peer_index_table::parse_peer_index_table;
use crate::messages::table_dump_v2::rib_afi_entries::parse_rib_afi_entries;
use crate::models::*;
#[cfg(test)]
use bytes::BufMut;
use bytes::Bytes;
use std::convert::TryFrom;
pub fn parse_table_dump_v2_message(
sub_type: u16,
mut input: Bytes,
) -> Result<TableDumpV2Message, ParserError> {
let v2_type: TableDumpV2Type = TableDumpV2Type::try_from(sub_type)?;
let msg: TableDumpV2Message = match v2_type {
TableDumpV2Type::PeerIndexTable => {
TableDumpV2Message::PeerIndexTable(parse_peer_index_table(&mut input)?)
}
TableDumpV2Type::RibIpv4Unicast
| TableDumpV2Type::RibIpv4Multicast
| TableDumpV2Type::RibIpv6Unicast
| TableDumpV2Type::RibIpv6Multicast
| TableDumpV2Type::RibIpv4UnicastAddPath
| TableDumpV2Type::RibIpv4MulticastAddPath
| TableDumpV2Type::RibIpv6UnicastAddPath
| TableDumpV2Type::RibIpv6MulticastAddPath => {
TableDumpV2Message::RibAfi(parse_rib_afi_entries(&mut input, v2_type)?)
}
TableDumpV2Type::RibGeneric | TableDumpV2Type::RibGenericAddPath => {
return Err(ParserError::Unsupported(
"TableDumpV2 RibGeneric is not currently supported".to_string(),
))
}
TableDumpV2Type::GeoPeerTable => {
TableDumpV2Message::GeoPeerTable(parse_geo_peer_table(&mut input)?)
}
};
Ok(msg)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_unsupported_type() {
let msg = parse_table_dump_v2_message(6, Bytes::new());
assert!(msg.is_err());
let msg = parse_table_dump_v2_message(13, Bytes::new());
assert!(msg.is_err());
}
#[test]
fn test_geo_peer_table_parsing() {
let mut bytes = bytes::BytesMut::new();
bytes.put_u32(0x01020304);
bytes.put_u16(0);
bytes.put_f32(0.0); bytes.put_f32(0.0);
bytes.put_u16(0);
let bytes = bytes.freeze();
let result = parse_table_dump_v2_message(7, bytes);
assert!(result.is_ok());
if let Ok(TableDumpV2Message::GeoPeerTable(geo_table)) = result {
assert_eq!(geo_table.view_name, "");
assert_eq!(geo_table.geo_peers.len(), 0);
} else {
panic!("Expected GeoPeerTable message");
}
}
}