Current section
Files
Jump to
Current section
Files
lib/avro_ex/schema/array.ex
defmodule AvroEx.Schema.Array do
use Ecto.Schema
alias AvroEx.{Error, Schema, Term}
alias AvroEx.Schema.Context
alias Ecto.Changeset
import Ecto.Changeset
@primary_key false
@required_fields [:items]
embedded_schema do
field :items, Term
end
@type t :: %__MODULE__{
items: Schema.schema_types,
}
def cast(params) do
cs = changeset(%__MODULE__{}, params)
if cs.valid? do
{:ok, apply_changes(cs)}
else
{:error, Error.errors(cs)}
end
end
def changeset(%__MODULE__{} = struct, params) do
struct
|> cast(params, @required_fields)
|> validate_required(@required_fields)
|> encode_items
end
defp encode_items(%Changeset{} = cs) do
items =
cs
|> get_field(:items)
|> Schema.cast
case items do
{:ok, item} -> put_change(cs, :items, item)
{:error, reason} -> add_error(cs, :items, reason)
end
end
def match?(%__MODULE__{items: item_type}, %Context{} = context, data) when is_list(data) do
Enum.all?(data, fn(item) ->
Schema.encodable?(item_type, context, item)
end)
end
def match?(_, _, _), do: false
end