Packages
open_api_spex
3.10.0
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/enum.ex
defmodule OpenApiSpex.Cast.Enum do
@moduledoc false
alias OpenApiSpex.Cast
def cast(ctx = %Cast{schema: %{enum: enum}, value: value}) do
case Enum.find(enum, {:error, :invalid_enum}, &equivalent?(&1, value)) do
{:error, :invalid_enum} -> Cast.error(ctx, {:invalid_enum})
found -> {:ok, found}
end
end
defp equivalent?(x, x), do: true
# Special case: atoms are equivalent to their stringified representation
defp equivalent?(left, right) when is_atom(left) and is_binary(right) do
to_string(left) == right
end
# an explicit schema should be used to cast to enum of structs
defp equivalent?(_x, %_struct{}), do: false
# Special case: Atom-keyed maps are equivalent to their string-keyed representation
defp equivalent?(left, right) when is_map(left) and is_map(right) do
Enum.all?(left, fn {k, v} ->
equivalent?(v, Map.get(right, to_string(k)))
end)
end
defp equivalent?(_left, _right), do: false
end