mirror of
https://github.com/rjNemo/exercism-elixir
synced 2026-06-06 02:16:48 +00:00
26 lines
987 B
Elixir
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
|