Packages
surgex
5.1.0
6.0.1
6.0.0
5.1.1
5.1.0
5.0.0
5.0.0-git-015aa39a
4.15.2
4.15.1
4.15.1-git-98b3
4.15.0
4.15.0-git-943e
4.15.0-git-5806
4.14.1
4.14.0
4.13.1
4.13.0
4.12.0
4.11.0
4.11.0-git-97d4
4.11.0-git-14c8
4.10.0
4.10.0-git-37f2
4.9.0
4.9.0-git-9d5f
4.8.1-git-80a7
4.8.0
4.8.0-git-fbda
4.8.0-git-e058
4.7.0
4.7.0-git-5414
4.6.1
4.6.0
4.5.0
4.4.0
4.3.0
4.2.1
4.2.0
4.1.1
4.1.1-git-9f6b
4.1.1-git-6f0cd
4.1.0
4.1.0-git-e934
4.1.0-git-8c28
4.1.0-git-56a9
4.1.0-git-55fd
4.0.0
3.2.8
3.2.7
3.2.6
3.2.5
3.2.4
3.2.3
3.2.2
3.2.1
3.2.0
retired
3.1.0
3.0.0
2.24.1
2.24.0
retired
2.23.0
2.22.0
2.21.0
2.20.1
2.20.0
2.19.0
2.18.1
2.18.0
2.17.0
2.16.0
2.15.0
2.14.0
2.13.0
2.12.1
2.12.0
2.11.0
2.10.0
2.9.0
2.8.0
2.7.0
2.6.0
2.5.1
2.5.0
2.4.0
retired
2.3.0
2.2.1
2.2.0
2.1.1
2.1.0
2.0.0
1.6.0
1.5.2
1.5.1
1.5.0
1.4.0
1.3.1
retired
1.3.0
retired
1.2.1
1.2.0
1.1.0
1.0.0
0.5.2
0.5.1
0.5.0
0.4.3
0.4.2
0.4.1
0.4.0
0.3.3
0.3.2
0.3.1
0.3.0
0.2.0
0.1.0
All Things Elixir @ Surge Ventures Inc, the creators of Fresha
Current section
Files
Jump to
Current section
Files
lib/surgex/parser/parsers/include_parser.ex
defmodule Surgex.Parser.IncludeParser do
@moduledoc """
Parses the JSON API's include parameter according to the
[JSON API spec](http://jsonapi.org/format/#fetching-includes).
Produces a list of includes constrained to the provided relationship paths.
"""
@type errors :: :invalid_relationship_path | :invalid_input
@type path :: atom() | String.t()
@doc false
@spec call(term(), [path()]) :: {:ok, [atom()]} | {:error, errors()}
def call(nil, _spec), do: {:ok, []}
def call("", _spec), do: {:ok, []}
def call(input, allowed_paths) when is_binary(input) do
paths = String.split(input, ",")
allowed_paths = Enum.map(allowed_paths, &convert_to_string/1)
validate_relationship_path(paths, allowed_paths)
end
def call(_input, _paths), do: {:error, :invalid_input}
defp convert_to_string(path) when is_binary(path), do: path
defp convert_to_string(path) when is_atom(path), do: Atom.to_string(path)
defp validate_relationship_path(paths, allowed_paths) do
case Enum.all?(paths, &Enum.member?(allowed_paths, &1)) do
true -> {:ok, Enum.map(paths, &String.to_atom/1)}
false -> {:error, :invalid_relationship_path}
end
end
@doc """
Flattens the result of the parser (inclusion list) into multiple keys.
## Examples
iex> IncludeParser.flatten({:ok, include: [:user]}, :include)
{:ok, include_user: true}
"""
@spec flatten({:ok, Keyword.t()}, String.t()) :: {:ok, Keyword.t()}
def flatten({:ok, opts}, key) do
case Keyword.pop(opts, key) do
{nil, _} ->
{:ok, opts}
{value_list, rem_opts} when is_list(value_list) ->
new_opts =
value_list
|> Enum.map(fn value -> {String.to_atom("#{key}_#{value}"), true} end)
|> Keyword.merge(rem_opts)
{:ok, new_opts}
end
end
def flatten(input, _key), do: input
end