module mimetypes; import std.csv; import std.traits; string[string] mimeTypes; static this() { mimeTypes = mimeMapping!("mimetypes.csv"); } template mimeMapping(string csvFile, T = string[string]) if (isAssociativeArray!T) { enum mimeMapping = makeMimeMapping!(import(csvFile), T); } private T makeMimeMapping(string csv, T)() if (isAssociativeArray!T) { T result; foreach (record; csvReader!T(csv, null)) { result[record["Extension"]] = record["Type"]; } return result; } string mimeType(string fileName) @safe { import std.path : extension; import std.uni : toLower; string ext; ext = fileName.extension(); if (!ext) return "application/octet-stream"; ext = ext[1 .. $].toLower(); return mimeTypes[ext]; }