route_verification 0.7.1

Parse RPSL in the IRR to verify observed BGP routes
Documentation
#![doc = include_str!("../README.md")]
use anyhow::{bail, Result};
use log::debug;

#[doc(inline)]
pub use {as_rel, bgp, common_regex, io, ir, irr, lex, parse};

pub mod fs;

pub fn parse_one(args: Vec<String>) -> Result<()> {
    if args.len() < 4 {
        bail!("Specify a file to read and a directory to write to!");
    }

    let filename = &args[2];
    debug!("Will read from {filename}.");
    let output_dir = &args[3];
    debug!("Will dump to {output_dir}.");
    fs::parse(filename, output_dir)
}

pub fn read(args: Vec<String>) -> Result<()> {
    if args.len() < 3 {
        bail!("Specify a directory to read!");
    }
    let input_dir = &args[2];
    debug!("Will read from {input_dir}.");
    fs::read(input_dir)
}

pub fn parse_all(args: Vec<String>) -> Result<()> {
    if args.len() < 4 {
        bail!("Specify a directory to read from and a directory to write to!");
    }

    let input_dir = &args[2];
    debug!("Will read from {input_dir}.");
    let output_dir = &args[3];
    debug!("Will dump to {output_dir}.");

    let (parsed, counts) = fs::parse_all(input_dir)?;
    println!("Summary\n\tParsed {parsed}.\n\t{counts}.");

    debug!("Starting to write the parsed IR.");
    parsed.pal_write(output_dir)?;
    debug!("Wrote the parsed IR.");

    Ok(())
}

pub fn parse_priority(args: Vec<String>) -> Result<()> {
    if args.len() < 4 {
        bail!("Specify directories to read from in descending order of priorities, and a directory to write to!");
    }

    let input_dirs = &args[2..args.len() - 1];
    debug!("Will read from {:?}.", input_dirs);
    let output_dir = &args.last().expect("`args.len() >= 5`");
    debug!("Will dump to {output_dir}.");

    fs::parse_priority(input_dirs, output_dir)
}

pub fn parse_ordered(args: Vec<String>) -> Result<()> {
    if args.len() < 4 {
        bail!("Specify DB files to read from in descending order of priorities, and a directory to write to!");
    }

    let input_dbs = &args[2..args.len() - 1];
    debug!("Will read from {:?}.", input_dbs);
    let output_dir = &args.last().expect("`args.len() >= 5`");
    debug!("Will dump to {output_dir}.");

    fs::parse_ordered(input_dbs, output_dir)
}

pub fn report(args: Vec<String>) -> Result<()> {
    if args.len() < 4 {
        bail!("Specify a directory to read parsed IR from and a MRT file to read from!");
    }

    let parsed_dir = &args[2];
    debug!("Will read parsed IR from {parsed_dir}.");

    let mrt_dir = &args[3];
    debug!("Will read MRT file from {mrt_dir}.");

    fs::report(parsed_dir, mrt_dir)
}

#[cfg(test)]
mod evcxr_examples;