Skip to content

Unexpected error raised when validating embeds_many field #18

Open
@fishtreesugar

Description

@fishtreesugar

Description

We are using strukt for validating external data input. For example we defined a schema with embeds_many field: bar:

defmodule Foo do
  use Strukt

  defstruct do
    embeds_many :bar, Bar do
      field :baz, :string
    end
  end
end

when using new/1 to parsing external data with wrong "embedded" type, it raise an unexpected error:

iex(2)> Foo.new(%{bar: "baz"})
** (Protocol.UndefinedError) protocol Enumerable not implemented for "baz" of type BitString. This protocol is implemented for the following type(s): Date.Range, File.Stream, Function, GenEvent.Stream, HashDict, HashSet, IO.Stream, Jason.OrderedObject, List, Map, MapSet, Range, Stream
    (elixir 1.16.1) lib/enum.ex:1: Enumerable.impl_for!/1
    (elixir 1.16.1) lib/enum.ex:166: Enumerable.reduce/3
    (elixir 1.16.1) lib/enum.ex:4399: Enum.map_reduce/3
    (elixir 1.16.1) lib/enum.ex:3865: Enum.with_index/2
    (strukt 0.3.2) lib/params.ex:41: Strukt.Params.transform/4
    (strukt 0.3.2) lib/params.ex:72: Strukt.Params.map_value_to_field/4
    (elixir 1.16.1) lib/enum.ex:1700: Enum."-map/2-lists^map/1-1-"/2
    iex:2: (file)

According to the stacktrace, it happens during conforming params:

formed_params = Strukt.Params.transform(__MODULE__, params, struct)

Expected behaviour

returns a validation error:

{:error,
 #Ecto.Changeset<
   action: :insert,
   changes: %{},
   errors: [bar: {"is invalid", [validation: :embed, type: {:array, :map}]}],
   data: #Foo<>,
   valid?: false
 >}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions