Packages
open_api_spex
3.18.3
3.22.3
3.22.2
3.22.1
3.22.0
3.21.5
3.21.4
3.21.3
3.21.2
3.21.1
3.21.0
3.20.1
3.20.0
3.19.1
3.19.0
3.18.3
3.18.2
3.18.1
3.18.0
3.17.3
3.17.2
3.17.1
3.17.0
3.16.4
3.16.3
3.16.2
3.16.1
3.16.0
3.15.0
3.14.0
3.13.0
3.12.0
3.11.0
3.10.0
3.9.0
3.8.0
3.7.0
3.6.0
3.5.2
3.5.1
3.5.0
3.4.0
3.3.0
3.2.1
3.2.0
3.1.0
3.0.0
2.3.1
2.3.0
2.2.0
2.1.1
2.1.0
2.0.0
1.1.4
1.1.3
1.1.2
1.1.1
1.1.0
1.0.1
1.0.0
Leverage Open Api Specification 3 (swagger) to document, test, validate and explore your Plug and Phoenix APIs.
Current section
Files
Jump to
Current section
Files
lib/open_api_spex/cast/number.ex
defmodule OpenApiSpex.Cast.Number do
@moduledoc false
alias OpenApiSpex.Cast
# credo:disable-for-next-line
# TODO We need a way to distinguish numbers in (JSON) body vs in request parameters
# so we can reject strings values for properties of `type: :number`
@spec cast(ctx :: Cast.t()) :: {:ok, Cast.t()} | Cast.Error.t()
def cast(%{value: value} = ctx) when is_number(value) do
case cast_number(ctx) do
{:cast, ctx} -> cast(ctx)
result -> result
end
end
def cast(%{value: value} = ctx) when is_binary(value) do
case Float.parse(value) do
{value, ""} -> cast(%{ctx | value: value})
_ -> Cast.error(ctx, {:invalid_type, :number})
end
end
def cast(ctx) do
Cast.error(ctx, {:invalid_type, :number})
end
## Private functions
defp cast_number(%{value: value, schema: %{minimum: minimum, exclusiveMinimum: true}} = ctx)
when is_number(value) and is_number(minimum) do
if value > minimum do
Cast.success(ctx, [:minimum, :exclusiveMinimum])
else
Cast.error(ctx, {:exclusive_min, minimum, value})
end
end
defp cast_number(%{value: value, schema: %{minimum: minimum}} = ctx)
when is_number(value) and is_number(minimum) do
if value >= minimum do
Cast.success(ctx, :minimum)
else
Cast.error(ctx, {:minimum, minimum, value})
end
end
defp cast_number(%{value: value, schema: %{maximum: maximum, exclusiveMaximum: true}} = ctx)
when is_number(value) and is_number(maximum) do
if value < maximum do
Cast.success(ctx, [:maximum, :exclusiveMaximum])
else
Cast.error(ctx, {:exclusive_max, maximum, value})
end
end
defp cast_number(%{value: value, schema: %{maximum: maximum}} = ctx)
when is_number(value) and is_number(maximum) do
if value <= maximum do
Cast.success(ctx, :maximum)
else
Cast.error(ctx, {:maximum, maximum, value})
end
end
# For now, we don't do anything with `:multipleOf` for properties of `type: :number`
defp cast_number(ctx), do: Cast.ok(ctx)
end