Current section

Files

Jump to
uploadex lib validation.ex
Raw

lib/validation.ex

defmodule Uploadex.Validation do
@moduledoc false
@type file :: map() | String.t
@spec validate_extensions([file], [String.t] | any) :: :ok | {:error, any()}
def validate_extensions(files, accepted_extensions) do
case all_extensions_accepted?(files, accepted_extensions) do
true ->
:ok
false ->
{:error, "Some files in #{inspect(get_file_names(files))} violate the accepted extensions: #{inspect(accepted_extensions)}"}
end
end
defp all_extensions_accepted?(_files, :any), do: true
defp all_extensions_accepted?(files, extensions) do
list_extensions = List.wrap(extensions)
Enum.all?(files, & extension_accepted?(&1, list_extensions))
end
defp extension_accepted?(%{filename: filename}, accepted_extensions), do: extension_accepted?(filename, accepted_extensions)
defp extension_accepted?(filename, accepted_extensions) when is_binary(filename) do
extension = filename |> Path.extname() |> String.downcase()
Enum.member?(accepted_extensions, extension)
end
def get_file_names(files) do
Enum.map(files, fn
%{filename: filename} -> filename
filename -> filename
end)
end
end