bgpkit_parser/parser/mrt/messages/table_dump_v2/
mod.rs1mod peer_index_table;
2mod rib_afi_entries;
3
4use crate::error::ParserError;
5use crate::messages::table_dump_v2::peer_index_table::parse_peer_index_table;
6use crate::messages::table_dump_v2::rib_afi_entries::parse_rib_afi_entries;
7use crate::models::*;
8use bytes::Bytes;
9use std::convert::TryFrom;
10
11pub fn parse_table_dump_v2_message(
24 sub_type: u16,
25 mut input: Bytes,
26) -> Result<TableDumpV2Message, ParserError> {
27 let v2_type: TableDumpV2Type = TableDumpV2Type::try_from(sub_type)?;
28
29 let msg: TableDumpV2Message = match v2_type {
30 TableDumpV2Type::PeerIndexTable => {
31 TableDumpV2Message::PeerIndexTable(parse_peer_index_table(&mut input)?)
33 }
34 TableDumpV2Type::RibIpv4Unicast
35 | TableDumpV2Type::RibIpv4Multicast
36 | TableDumpV2Type::RibIpv6Unicast
37 | TableDumpV2Type::RibIpv6Multicast
38 | TableDumpV2Type::RibIpv4UnicastAddPath
39 | TableDumpV2Type::RibIpv4MulticastAddPath
40 | TableDumpV2Type::RibIpv6UnicastAddPath
41 | TableDumpV2Type::RibIpv6MulticastAddPath => {
42 TableDumpV2Message::RibAfi(parse_rib_afi_entries(&mut input, v2_type)?)
43 }
44 TableDumpV2Type::RibGeneric
45 | TableDumpV2Type::RibGenericAddPath
46 | TableDumpV2Type::GeoPeerTable => {
47 return Err(ParserError::Unsupported(
48 "TableDumpV2 RibGeneric and GeoPeerTable is not currently supported".to_string(),
49 ))
50 }
51 };
52
53 Ok(msg)
54}
55
56#[cfg(test)]
57mod tests {
58 use super::*;
59
60 #[test]
61 fn test_unsupported_type() {
62 let msg = parse_table_dump_v2_message(7, Bytes::new());
63 assert!(msg.is_err());
64 }
65}