Packages
open_api_spex
3.12.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/array.ex
defmodule OpenApiSpex.Cast.Array do
@moduledoc false
alias OpenApiSpex.Cast
def cast(%{value: [], schema: %{minItems: nil}}) do
{:ok, []}
end
def cast(%{value: items} = ctx) when is_list(items) do
case cast_array(ctx) do
{:cast, ctx} -> cast(ctx)
{items, []} -> Cast.ok(%{ctx | value: items})
{_, errors} -> {:error, errors}
end
end
def cast(ctx),
do: Cast.error(ctx, {:invalid_type, :array})
## Private functions
defp cast_array(%{value: value, schema: %{minItems: minimum}} = ctx) when is_integer(minimum) do
item_count = Enum.count(value)
if item_count < minimum do
Cast.error(ctx, {:min_items, minimum, item_count})
else
Cast.success(ctx, :minItems)
end
end
defp cast_array(%{value: value, schema: %{maxItems: maximum}} = ctx) when is_integer(maximum) do
item_count = Enum.count(value)
if item_count > maximum do
Cast.error(ctx, {:max_items, maximum, item_count})
else
Cast.success(ctx, :maxItems)
end
end
defp cast_array(%{value: value, schema: %{uniqueItems: true}} = ctx) do
unique_size =
value
|> MapSet.new()
|> MapSet.size()
if unique_size != Enum.count(value) do
Cast.error(ctx, {:unique_items})
else
Cast.success(ctx, :uniqueItems)
end
end
defp cast_array(%{value: items} = ctx) do
cast_results =
items
|> Enum.with_index()
|> Enum.map(fn {item, index} ->
path = [index | ctx.path]
Cast.cast(%{ctx | value: item, schema: ctx.schema.items, path: path})
end)
errors =
for({:error, errors} <- cast_results, do: errors)
|> Enum.concat()
items = for {:ok, item} <- cast_results, do: item
{items, errors}
end
end