Current section

Files

Jump to
ecto_resource lib option_parser.ex
Raw

lib/option_parser.ex

defmodule EctoResource.OptionParser do
@functions %{
all: %{
arity: 1,
name: "all",
errorable: false
},
change: %{
arity: 1,
name: "change",
errorable: false
},
create: %{
arity: 1,
name: "create",
errorable: false
},
create!: %{
arity: 1,
name: "create",
errorable: true
},
delete: %{
arity: 1,
name: "delete",
errorable: false
},
delete!: %{
arity: 1,
name: "delete",
errorable: true
},
get: %{
arity: 2,
name: "get",
errorable: false
},
get!: %{
arity: 2,
name: "get",
errorable: true
},
update: %{
arity: 2,
name: "update",
errorable: false
},
update!: %{
arity: 2,
name: "update",
errorable: true
}
}
def parse(suffix, []) do
@functions
|> Map.keys()
|> Enum.reduce(%{}, fn function, acc ->
accumulate_functions(acc, suffix, function)
end)
end
def parse(suffix, only: filters) do
filters = add_error_filters(filters)
@functions
|> Map.keys()
|> Enum.filter(fn function -> Enum.member?(filters, function) end)
|> Enum.reduce(%{}, fn function, acc ->
accumulate_functions(acc, suffix, function)
end)
end
def parse(suffix, except: filters) do
filters = add_error_filters(filters)
@functions
|> Map.keys()
|> Enum.reject(fn function -> Enum.member?(filters, function) end)
|> Enum.reduce(%{}, fn function, acc ->
accumulate_functions(acc, suffix, function)
end)
end
def parse(suffix, :read), do: parse(suffix, only: [:all, :get])
def parse(suffix, :write), do: parse(suffix, only: [:change, :create, :update])
def parse(suffix, :delete), do: parse(suffix, only: [:delete])
defp accumulate_functions(acc, suffix, function) do
fn_map = @functions[function]
Map.put(acc, function, %{
name: function_name(suffix, fn_map),
description: function_description(suffix, fn_map)
})
end
defp add_error_filters(filters) do
Enum.reduce(filters, filters, fn filter, acc ->
[:"#{filter}!" | acc]
end)
end
defp function_name(suffix, %{name: "all"}) do
suffix = Inflex.pluralize(suffix)
:"all_#{suffix}"
end
defp function_name(suffix, %{name: name, errorable: true}),
do: :"#{name}_#{suffix}!"
defp function_name(suffix, %{name: name}),
do: :"#{name}_#{suffix}"
defp function_description(suffix, %{name: "all", arity: arity}) do
suffix = Inflex.pluralize(suffix)
"all_#{suffix}/#{arity}"
end
defp function_description(suffix, %{name: name, arity: arity, errorable: true}),
do: "#{name}_#{suffix}!/#{arity}"
defp function_description(suffix, %{name: name, arity: arity}),
do: "#{name}_#{suffix}/#{arity}"
end