module aurorafw.metadata.signature; import std.conv : to; import std.stdio : File; import std.algorithm.comparison; enum FileSignature { PDF, JPEG, JPG = JPEG, PNG, IMG, ISO, DOC, DOCX, Unknown } FileSignature detectFileSignature(File file) { char[8] buf = file.rawRead(new char[8]); if (buf[0 .. 3] == cast(char[])[0xFF, 0xD8, 0xFF]) return FileSignature.JPEG; else if (buf[0 .. 4] == cast(char[])[0x25, 0x50, 0x44, 0x46]) return FileSignature.PDF; else if (buf[0 .. 5] == cast(char[])[0x43, 0x44, 0x30, 0x30, 0x31]) return FileSignature.ISO; else if (buf[0 .. 8] == cast(char[])[0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]) return FileSignature.PNG; else return FileSignature.Unknown; } @property @safe string toString(FileSignature val) { switch (val) { case FileSignature.PDF: return "Portable Document Format"; case FileSignature.ISO: return "ISO-9660 CD Disc Image"; case FileSignature.JPEG: return "Joint Photographic Experts Group"; case FileSignature.PNG: return "Portable Network Graphics"; default: return to!string(val); } }