nmap-analyze 1.0.0

Analyzes nmap xml output and compares results with expected specification
Documentation
extern crate nmap_analyze;
extern crate spectral;

use nmap_analyze::output::{OutputConfig, OutputDetail, OutputFormat};
use nmap_analyze::*;

use spectral::prelude::*;

fn main() {
    let expected_output = r##"
+-------------+----------+--------+------+-------------+-----------------------------+
| Host        | Portspec | Result | Port | Port Result | Failure Reason              |
+-------------+----------+--------+------+-------------+-----------------------------+
| 192.168.0.1 | Group A  | Fail   |      |             |                             |
|             |          |        | 22   | failed      | expected Closed, found Open |
|             |          |        | 80   | failed      | expected Closed, found Open |
|             |          |        | 81   | failed      | expected Open, found Closed |
|             |          |        | 139  | failed      | expected Closed, found Open |
|             |          |        | 443  | failed      | expected Closed, found Open |
|             |          |        | 444  | failed      | expected Open, found Closed |
|             |          |        | 445  | failed      | expected Closed, found Open |
|             |          |        | 465  | failed      | expected Closed, found Open |
|             |          |        | 587  | failed      | expected Closed, found Open |
|             |          |        | 993  | failed      | expected Closed, found Open |
|             |          |        | 3261 | failed      | expected Closed, found Open |
|             |          |        | 5000 | failed      | expected Closed, found Open |
|             |          |        | 5001 | failed      | expected Closed, found Open |
+-------------+----------+--------+------+-------------+-----------------------------+
"##;
    use nmap_analyze::output::HumanOutput;

    let portspecs =
        PortSpecs::from_file("tests/portspecs.yml").expect("Failed to load portspecs file");
    let mapping =
        Mapping::from_file("tests/portspec_mapping.json").expect("Failed to mappings file");
    let nmap_run = Run::from_file("tests/nmap-dd_all_ports.xml").expect("Failed to load nmap file");
    nmap_run.is_sane().expect("Nmap file is not sane");

    let analyzer_result = default_analysis(&nmap_run, &mapping, &portspecs);

    let output_config = OutputConfig {
        detail: OutputDetail::Fail,
        format: OutputFormat::Human,
        color: false,
    };

    let mut buffer = String::from("\n"); // \n allows for nicer expected raw string formatting.
    unsafe {
        analyzer_result
            .output(&output_config, &mut buffer.as_mut_vec())
            .expect("Output failed")
    }

    asserting("Output is correct")
        .that(&buffer.as_ref())
        .is_equal_to(expected_output);
}