exercism-elixir/file-sniffer/lib/file_sniffer.ex
2022-02-11 06:56:31 -04:00

26 lines
987 B
Elixir

defmodule FileSniffer do
@mimi_types %{
"bmp" => "image/bmp",
"gif" => "image/gif",
"jpg" => "image/jpg",
"png" => "image/png",
"exe" => "application/octet-stream"
}
def type_from_extension(extension), do: Map.get(@mimi_types, extension)
def type_from_binary(<<0x42, 0x4D, _::binary>>), do: type_from_extension("bmp")
def type_from_binary(<<0x47, 0x49, 0x46, _::binary>>), do: type_from_extension("gif")
def type_from_binary(<<0xFF, 0xD8, 0xFF, _::binary>>), do: type_from_extension("jpg")
def type_from_binary(<<0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, _::binary>>),
do: type_from_extension("png")
def type_from_binary(<<0x7F, 0x45, 0x4C, 0x46, _::binary>>), do: type_from_extension("exe")
def verify(file_binary, extension) do
case {type_from_extension(extension), type_from_binary(file_binary)} do
{type, type} -> {:ok, type}
_ -> {:error, "Warning, file format and file extension do not match."}
end
end
end