lib/avro_ex/schema/record.ex

defmodule AvroEx.Schema.Record do
  use TypedStruct

  alias AvroEx.{Schema, Schema.Context, Schema.Record}

  typedstruct do
    field :aliases, [Schema.alias()], default: []
    field :doc, String.t()
    field :name, String.t(), enforce: true
    field :namespace, String.t()
    field :metadata, Schema.metadata(), default: %{}
    field :fields, [Record.Field.t()], default: []
  end

  @spec match?(t, Context.t(), term) :: boolean
  def match?(%__MODULE__{fields: fields}, %Context{} = context, data)
      when is_map(data) and map_size(data) == length(fields) do
    Enum.all?(fields, fn %Record.Field{name: name} = field ->
      data =
        Map.new(data, fn
          {k, v} when is_binary(k) -> {k, v}
          {k, v} when is_atom(k) -> {to_string(k), v}
        end)

      Map.has_key?(data, name) and Schema.encodable?(field, context, data[name])
    end)
  end

  def match?(_record, _context, _data), do: false
end