Packages
surgex
5.0.0-git-015aa39a
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_parser.ex
defmodule Surgex.Parser.IdParser do
@moduledoc false
alias Surgex.Parser.IntegerParser
@type errors :: :invalid_identifier | :invalid_max | IntegerParser.errors()
@type numeric_id_types :: :int | :integer | :bigint | :biginteger | :serial | :bigserial
@type option :: {:max, integer() | numeric_id_types()}
# This parser already validates that ids cannot be below zero
# therefore we don't handle the minimum case
# See reference here for numeric types: https://www.postgresql.org/docs/current/datatype-numeric.html
@int8_max 9_223_372_036_854_775_807
@int4_max 2_147_483_647
@numeric_type_to_max_size %{
bigint: @int8_max,
biginteger: @int8_max,
bigserial: @int8_max,
int: @int4_max,
integer: @int4_max,
serial: @int4_max
}
@spec call(term(), [option()]) :: {:ok, integer | nil} | {:error, errors}
def call(input, opts \\ [])
def call(nil, _opts), do: {:ok, nil}
def call("", _opts), do: {:ok, nil}
def call(input, opts) when is_binary(input) do
max = Keyword.get(opts, :max)
with {:ok, max} <- parse_max(max) do
case IntegerParser.call(input, max: max, min: 1) do
{:ok, integer} -> {:ok, integer}
{:error, :out_of_range} -> {:error, :invalid_identifier}
{:error, reason} -> {:error, reason}
end
end
end
def call(_input, _opts), do: {:error, :invalid_identifier}
def parse_max(max) when is_integer(max), do: {:ok, max}
for {type, size} <- @numeric_type_to_max_size do
def parse_max(unquote(type)), do: {:ok, unquote(size)}
end
def parse_max(nil), do: {:ok, nil}
def parse_max(_max), do: {:error, :invalid_max}
end