Skip to content

Instantly share code, notes, and snippets.

@erez-rabih
Created March 1, 2018 13:16
Show Gist options
  • Save erez-rabih/a8621a1c70f3e990d0d4b3059d4bef6a to your computer and use it in GitHub Desktop.
Save erez-rabih/a8621a1c70f3e990d0d4b3059d4bef6a to your computer and use it in GitHub Desktop.
defmodule Plug.Validator do
def init(opts), do: opts
def call(conn, opts) do
case conn.private[:validate] do
nil -> conn
validations -> validate(Conn.fetch_query_params(conn), validations, opts[:on_error])
end
end
defp validate(conn, validations, on_error) do
errors = collect_errors(conn, validations)
if Enum.empty?(errors) do
conn
else
on_error.(conn, errors)
end
end
defp collect_errors(conn, validations) do
Enum.reduce(validations, %{}, errors_collector(conn))
end
defp errors_collector(conn) do
fn {field, vf}, acc ->
value = conn.params[to_string(field)]
case vf.(value) do
{:error, msg} -> Map.put(acc, field, msg)
_ -> acc
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment