crcany 0.0.1

Compute any CRC.
Documentation
use crcany::crc::{Crc, FromSpec};
use crcany::model::{BitwiseModel, BytewiseModel, WordwiseModel};
use crcany::spec::Spec;

const ALL_CRCS: &str = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/allcrcs.txt"));

fn main() {
    let all_specs: Vec<Spec> = ALL_CRCS
        .lines()
        .map(|line| line.parse())
        .collect::<Result<Vec<_>, _>>()
        .unwrap();

    let mut good_bits = 0;
    let mut good_bytes = 0;
    let mut good_words = 0;
    let total = all_specs.len();

    for spec in all_specs {
        let bitly = BitwiseModel::from_spec(spec.clone());

        let start = bitly.crc(0, b"".iter().cloned());
        let crc = bitly.crc(start, b"123456789".iter().cloned());

        if spec.check != crc {
            println!(
                "Error on CRC {} (bitwise), expected {:#06x}, got {:#06x}",
                spec.name, spec.check, crc
            );
        } else {
            good_bits += 1;
        }

        let bytely = BytewiseModel::from_spec(spec.clone());

        let start = bytely.crc(0, b"".iter().cloned());
        let crc = bytely.crc(start, b"123456789".iter().cloned());

        if spec.check != crc {
            println!(
                "Error on CRC {} (bytewise), expected {:#06x}, got {:#06x}",
                spec.name, spec.check, crc
            );
        } else {
            good_bytes += 1;
        }

        let wordly = WordwiseModel::from_spec(spec.clone());

        let start = wordly.crc(0, b"".iter().cloned());
        let crc = wordly.crc(start, b"123456789".iter().cloned());

        if spec.check != crc {
            println!(
                "Error on CRC {} (wordwise), expected {:#06x}, got {:#06x}",
                spec.name, spec.check, crc
            );
        } else {
            good_words += 1;
        }
    }

    println!("Passed bitwise: {}/{}", good_bits, total);
    println!("Passed bytewise: {}/{}", good_bytes, total);
    println!("Passed wordwise: {}/{}", good_words, total);
}