defmodule DataSchema.MapAccessor do @moduledoc """ Defines a way to use elixir maps as an input data source. This will `Map.get/2` the fields from the source data, meaning it will return nil in the case of the key being missing. """ @behaviour DataSchema.DataAccessBehaviour @impl true @doc """ Accesses the source data using `Map.get/2` when a `:field` type is encountered during struct creation. If the incoming data is not a map we will function clause error. """ def field(data = %{}, field), do: Map.get(data, field) @impl true @doc """ Accesses the source data using `Map.get/2` when a `:list_of` type is encountered during struct creation. """ def list_of(data = %{}, field), do: Map.get(data, field) @impl true @doc """ Accesses the source data using `Map.get/2` when a `:has_one` type is encountered during struct creation. """ def has_one(data = %{}, field), do: Map.get(data, field) @impl true @doc """ Accesses the source data using `Map.get/2` when a `:has_many` type is encountered during struct creation. """ def has_many(data = %{}, field), do: Map.get(data, field) end