loc 0.5.0

Count lines of code (cloc) fast.
Documentation
extern crate loc;

use loc::*;

// Because I can.  Seems bad though. Need a test runner with better output, or neeed to learn
macro_rules! test_count {
    ($path:expr, $exp:expr, $count:ident, $code:ident, $comment:ident, $blank:ident, $lines:ident) => (
        #[test]
        fn $count() {
            assert_eq!($exp, count($path));
        }

        #[test]
        fn $code() {
            assert_eq!($exp.code, count($path).code)
        }

        #[test]
        fn $comment() {
            assert_eq!($exp.comment, count($path).comment)
        }

        #[test]
        fn $blank() {
            assert_eq!($exp.blank, count($path).blank)
        }

        #[test]
        fn $lines() {
            assert_eq!($exp.lines, count($path).lines)
        }
    )
}

const PLASMA: &'static str = "tests/data/plasma.c";
const PLASMA_EXPECTED: Count = Count {
    code: 32032,
    blank: 8848,
    comment: 3792,
    lines: 44672,
};

test_count![PLASMA, PLASMA_EXPECTED, t_plasma_count, t_plasma_code, t_plasma_comment, t_plasma_blank, t_plasma_lines];

const FE: &'static str = "tests/data/fe25519.c";
const FE_EXPECTED: Count = Count {
    code: 278,
    blank: 51,
    comment: 8,
    lines: 278 + 51 + 8,
};

test_count![FE, FE_EXPECTED, test_fe_count, test_fe_code, test_fe_comment, test_fe_blank, test_fe_lines];

const EBC: &'static str = "tests/data/ebcdic.c";
const EBC_EXPECTED: Count = Count {
    code: 165,
    blank: 18,
    comment: 101,
    lines: 165 + 18 + 101,
};

test_count![EBC, EBC_EXPECTED, ebc_count, ebc_code, ebc_comment, evc_blank, ebc_lines];

const DUMB: &'static str = "tests/data/dumb.c";
const DUMB_EXPECTED: Count = Count {
    code: 2,
    blank: 0,
    comment: 3,
    lines: 5,
};
test_count![DUMB, DUMB_EXPECTED, dumb_count, dumb_code, dumb_comment, dumb_blank, dumb_lines];

const IPL: &'static str = "tests/data/ipl_funcs.c";
const IPL_EXPECTED: Count = Count {
    code: 25,
    blank: 6,
    comment: 43,
    lines: 25 + 6 + 43,
};
test_count![IPL, IPL_EXPECTED, ipl_count, ipl_code, ipl_comment, ipl_blank, ipl_lines];

const LUA: &'static str = "tests/data/lua.lua";
const LUA_EXPECTED: Count = Count {
    code: 7,
    blank: 1,
    comment: 8,
    lines: 7 + 8 + 1,
};
test_count![LUA, LUA_EXPECTED, lua_count, lua_code, lua_comment, lua_blank, lua_lines];

const RUBY: &'static str = "tests/data/test.rb";
const RUBY_EXPECTED: Count = Count {
    code: 2,
    blank: 0,
    comment: 2,
    lines: 2+2,
};
test_count![RUBY, RUBY_EXPECTED, ruby_count, ruby_code, ruby_comment, ruby_blank, ruby_lines];

const OCAML: &'static str = "tests/data/ocaml.ml";
const OCAML_EXPECTED: Count = Count {
    code: 3,
    blank: 4,
    comment: 6,
    lines: 3+4+6,
};
test_count![OCAML, OCAML_EXPECTED, ocaml_count, ocaml_code, ocaml_comment, ocaml_blank, ocaml_lines];

// single only
const ADA: &'static str = "tests/data/ada.ada";
const ADA_EXPECTED: Count = Count {
    code: 4,
    blank: 0,
    comment: 3,
    lines: 4+3,
};
test_count![ADA, ADA_EXPECTED, ada_count, ada_code, ada_comment, ada_blank, ada_lines];

const GHERKIN: &'static str = "tests/data/gherkin.feature";
const GHERKIN_EXPECTED: Count = Count {
    code: 8,
    blank: 2,
    comment: 2,
    lines: 8+2+2,
};
test_count![GHERKIN, GHERKIN_EXPECTED, gherkin_count, gherkin_code, gherkin_comment, gherkin_blank, gherkin_lines];

const GROOVY: &'static str = "tests/data/test.groovy";
const GROOVY_EXPECTED: Count = Count {
    code: 6,
    blank: 1,
    comment: 10,
    lines: 6+1+10,
};
test_count![GROOVY, GROOVY_EXPECTED, groovy_count, groovy_code, groovy_comment, groovy_blank, groovy_lines];

const TERRAFORM: &'static str = "tests/data/test.tf";
const TERRAFORM_EXPECTED: Count = Count {
    code: 65,
    blank: 13,
    comment: 11,
    lines: 65+13+11,
};
test_count![TERRAFORM, TERRAFORM_EXPECTED, terraform_count, terraform_code, terraform_comment, terraform_blank, terraform_lines];

const ZIG: &'static str = "tests/data/zig.zig";
const ZIG_EXPECTED: Count = Count {
    code: 5,
    blank: 2,
    comment: 2,
    lines: 5+2+2,
};
test_count![ZIG, ZIG_EXPECTED, zig_count, zig_code, zig_comment, zig_blank, zig_lines];

const NIX: &'static str = "tests/data/test.nix";
const NIX_EXPECTED: Count = Count {
    code: 3,
    blank: 2,
    comment: 3,
    lines: 3+2+3,
};
test_count![NIX, NIX_EXPECTED, nix_count, nix_code, nix_comment, nix_blank, nix_lines];

const POWERSHELL: &'static str = "tests/data/test.ps1";
const POWERSHELL_EXPECTED: Count = Count {
    code: 2,
    blank: 1,
    comment: 6,
    lines: 2+1+6,
};
test_count![POWERSHELL, POWERSHELL_EXPECTED, powershell_count, powershell_code, powershell_comment, powershell_blank, powershell_lines];

const HANDLEBARS: &'static str = "tests/data/test.handlebars";
const HANDLEBARS_EXPECTED: Count = Count {
    code: 2,
    blank: 0,
    comment: 2,
    lines: 2+0+2,
};
test_count![HANDLEBARS,
            HANDLEBARS_EXPECTED,
            handlebars_count,
            handlebars_code,
            handlebars_comment,
            handlebars_blank,
            handlebars_lines];

const NESTED_HASKELL: &'static str = "tests/data/nested-comments.hs";
const NESTED_HASKELL_EXPECTED: Count = Count {
    code: 2,
    blank: 4,
    comment: 8,
    lines: 2+4+8,
};
test_count![NESTED_HASKELL,
            NESTED_HASKELL_EXPECTED,
            nested_haskell_count,
            nested_haskell_code,
            nested_haskell_comment,
            nested_haskell_blank,
            nested_haskell_lines];