/**
 * Parsing mime/types files.
 * Authors:
 *  $(LINK2 https://github.com/FreeSlave, Roman Chistokhodov)
 * License:
 *  $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
 * Copyright:
 *  Roman Chistokhodov, 2016
 */

module mime.files.types;

import mime.common;
public import mime.files.common;

private {
    import std.algorithm;
    import std.exception;
    import std.range;
    import std..string;
    import std.traits;
}


/**
 * Parse mime/types file by line ignoring empty lines and comments.
 * Returns:
 *  Range of mime type names.
 * Throws:
 *  $(D mime.files.common.MimeFileException) on parsing error.
 */
auto typesFileReader(Range)(Range byLine) if(isInputRange!Range && is(ElementType!Range : string)) {
    return byLine.filter!(lineFilter).map!(function(string line) {
        line = line.stripRight;
        if (isValidMimeTypeName(line)) {
            return line;
        } else {
            throw new MimeFileException("Malformed types file: invalid MIME type name", line);
        }
    });
}

///
unittest
{
    string[] lines = ["#comment", "", "application/x-md2", "application/x-md3"];
    assert(equal(lines[2..$], typesFileReader(lines)));

    assertThrown(typesFileReader(["notmimetype"]).array, "must throw");
}