46 lines
737 B
D
46 lines
737 B
D
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];
|
|
}
|