Packages
surgex
4.8.0-git-e058
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/id_list_parser.ex
defmodule Surgex.Parser.IdListParser do
@moduledoc false
alias Surgex.Parser.IdParser
@type errors :: :invalid_identifier | :invalid_id_list_length | IdParser.errors()
@type option :: {:max, integer()}
@spec call(term(), [option()]) :: {:ok, [integer()]} | {:error, errors()}
def call(input, opts \\ [])
def call(nil, _opts), do: {:ok, []}
def call("", _opts), do: {:ok, []}
def call(input, opts) when is_binary(input) do
input
|> String.split(",")
|> Enum.reduce({:ok, []}, &reduce_ids/2)
|> reverse()
|> check_max(Keyword.get(opts, :max))
end
def call(input, opts) when is_list(input) do
input
|> Enum.reduce({:ok, []}, &reduce_ids/2)
|> reverse()
|> check_max(Keyword.get(opts, :max))
end
def call(_input, _opts), do: {:error, :invalid_id_list}
defp reduce_ids(_, {:error, reason}) do
{:error, reason}
end
defp reduce_ids(id_string, {:ok, previous_ids}) when is_binary(id_string) do
case IdParser.call(id_string) do
{:ok, id} ->
{:ok, [id | previous_ids]}
{:error, reason} ->
{:error, reason}
end
end
defp reduce_ids(id, {:ok, previous_ids}) when is_integer(id) and id > 0 do
{:ok, [id | previous_ids]}
end
defp reduce_ids(id, {:ok, _previous_ids}) when is_integer(id) do
{:error, :invalid_identifier}
end
defp reverse({:ok, ids}), do: {:ok, Enum.reverse(ids)}
defp reverse(error), do: error
defp check_max({:ok, ids}, limit) when is_integer(limit) and length(ids) > limit do
{:error, :invalid_id_list_length}
end
defp check_max(ok_or_error, _limit_or_nil), do: ok_or_error
end