Function treeMagicFileReader

Reads treemagic file contents and push treemagic entries to sink.

void treeMagicFileReader(OutRange) (
  const(void)[] data,
  OutRange sink
)
if (isOutputRange!(OutRange, TreeMagicEntry));

Throws

TreeMagicFileException on error.

Example

auto data =
    "MIME-TreeMagic\0\n[50:x-content/video-bluray]\n" ~
    ">\"BDAV\"=directory,non-empty\n" ~
        "1>\"autorun\"=file,executable,match-case\n" ~
        "1>\"testlink\"=link\n" ~
    ">\"testfile\"=any,application/x-executable,executable\n";

void sink(TreeMagicEntry t) {
    assert(t.mimeType == "x-content/video-bluray");
    assert(t.magic.weight == 50);
    assert(t.magic.matches.length == 2);

    auto submatch = t.magic.matches[0];
    assert(submatch.path == "BDAV");
    assert(submatch.type == TreeMatch.Type.directory);
    assert(submatch.nonEmpty);
    assert(submatch.submatches.length == 2);

    auto otherSubmatch = t.magic.matches[1];
    assert(otherSubmatch.path == "testfile");
    assert(otherSubmatch.type == TreeMatch.Type.any);
    assert(otherSubmatch.executable);
    assert(otherSubmatch.mimeType == "application/x-executable");

    auto autorun = submatch.submatches[0];
    assert(autorun.path == "autorun");
    assert(autorun.submatches.length == 0);
    assert(autorun.type == TreeMatch.Type.file);
    assert(autorun.executable);
    assert(autorun.matchCase);

    auto testlink = submatch.submatches[1];
    assert(testlink.path == "testlink");
    assert(testlink.type == TreeMatch.Type.link);
}
treeMagicFileReader(data, &sink);

void emptySink(TreeMagicEntry t) {

}
assertThrown!TreeMagicFileException(treeMagicFileReader("MIME-wrong-magic", &emptySink));

data = "MIME-TreeMagic\0\n[50:x-content/video-bluray]\n" ~
    ">\"BDAV\"=unknown\n";
assertThrown!TreeMagicFileException(treeMagicFileReader(data, &emptySink));

data = "MIME-TreeMagic\0\n[50:x-content/video-bluray]\n" ~
    ">\"BDAV\"=directory,unexpected\n";
assertThrown!TreeMagicFileException(treeMagicFileReader(data, &emptySink));