Skip to content

Instantly share code, notes, and snippets.

@falood
Last active March 11, 2017 16:08
Show Gist options
  • Save falood/a2c436add986153c7bc60ffa3f867aef to your computer and use it in GitHub Desktop.
Save falood/a2c436add986153c7bc60ffa3f867aef to your computer and use it in GitHub Desktop.
Macro in maru step by step: Parameters
params do
  requires :a
  optional :b
end

compile to

@parameters [
  %{key: :a, required: true},
  %{key: :b, required: false}
]
params do
  requires :a
  optional :b
end
get do
  IO.inspect params
end

compile to

@parameters [
  %{key: :a, required: true},
  %{key: :b, required: false}
]
def route(%Plug.Conn{method: "GET", path_info: [], params: plug_params}, _) do
  params = AnotherModule.parse_params(@parameters, plug_params)
  IO.inspect params
end

helper

defmodule AnotherModule do
  def parse_params(maru_params, plug_params), do: parse_params(maru_params, plug_params, %{})
  defp parse_params([], plug_params, result), do: result
  defp parse_params([h|t], plug_params, result) do
    value = case {h[:required], plug_params[to_string(h[:key])]} do
      {true, nil} -> raise "required #{h.key}"
      {_, value}  -> value
    end
    parse_params(t, plug_params, put_in(result, h[:key], value)
  end
end
params do
  requires :a, validator: fn _, _ -> true end
  optional :b
end
get do
  IO.inspect params
end

compile to

@parameters [
  %{key: :a, required: true, valudator: quote do fn _ -> true end},
  %{key: :b, required: false}
]
def route(%Plug.Conn{method: "GET", path_info: [], params: plug_params}, _) do
  params = AnotherModule.parse_params(@parameters, plug_params)
  IO.inspect params
end

helper

defmodule AnotherModule do
  def parse_params(maru_params, plug_params), do: parse_params(maru_params, plug_params, %{})
  defp parse_params([], plug_params, result), do: result
  defp parse_params([h|t], plug_params, result) do
    value = case {h[:required], plug_params[to_string(h[:key])]} do
      {true, nil} -> raise "required #{h.key}"
      {_, value}  -> value
    end
    if Map.has_key?(h, :validator) do
      h[:validator].(value) || raise "validat error"
    end
    parse_params(t, plug_params, put_in(result, h[:key], value)
  end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment