/**
 * Parsing mime/icons and mime/generic-icons 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, 2015-2016
 */

module mime.files.icons;

public import mime.files.common;

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

///Represents one line in icons file.
alias Tuple!(string, "mimeType", string, "iconName") IconLine;

/**
 * Parse mime/icons or mime/generic-icons file by line ignoring empty lines and comments.
 * Returns:
 *  Range of $(D IconLine) tuples.
 * Throws:
 *  $(D mime.files.common.MimeFileException) on parsing error.
 */
auto iconsFileReader(Range)(Range byLine) if(isInputRange!Range && is(ElementType!Range : string))
{
    return byLine.filter!(lineFilter).map!(function(string line) {
        auto result = findSplit(line, ":");
        if (result[1].empty) {
            throw new MimeFileException("Malformed icons file: mime type and icon must be separated by colon", line);
        } else {
            return IconLine(result[0], result[2]);
        }
    });
}

///
unittest
{
    string[] lines = ["application/x-archive:package-x-generic", "application/x-perl:text-x-script"];
    auto expected = [IconLine("application/x-archive", "package-x-generic"), IconLine("application/x-perl", "text-x-script")];
    assert(equal(iconsFileReader(lines), expected));

    assertThrown!MimeFileException(iconsFileReader(["application/nocolon"]).array, "must throw");
}