defmodule DataSchema.Errors do @moduledoc """ When we create a struct we either return the struct we were creating or we return this error. The error/errors that happened during struct creation are collected into this struct """ @typedoc """ An error is the struct key that caused the error and either an error message or a DataSchema.Errors struct in the case of nested error. """ @type t :: %__MODULE__{errors: [{atom, String.t() | __MODULE__.t()}]} defstruct errors: [] @doc """ Adds an error to the given errors struct. The error is prepended to the list of current errors. """ def add_error(%__MODULE__{} = errors, error) do %{errors | errors: [error | errors.errors]} end end # if we have a recursive error type it's easy to create errors and you can tell if you read # it where the nested error is... but flattening that error gets tricky. IT depends what the # user wants to do with it. # # Is this a good idea? Even needed? Shall we just not do recursive errors? # def flatten_error_messages(%__MODULE__{errors: []}), do: "No Errors!" # def flatten_error_messages(%__MODULE__{} = errors) do # do_flatten_error_messages(errors.errors, [[]]) # end # def do_flatten_error_messages([], acc) do # # Enum.map(acc, &:lists.reverse/1) # # |> :lists.reverse() # acc # end # def do_flatten_error_messages([{field, string} | rest], [stuff | acc]) when is_binary(string) do # do_flatten_error_messages(rest, [ stuff, [field | stuff] | acc]) # end # def do_flatten_error_messages([{field, %DataSchema.Errors{} = e} | rest], [stuff |acc]) do # field |> IO.inspect(limit: :infinity, label: "ffffff") # new_acc = do_flatten_error_messages(e.errors, [[field | stuff] | acc]) # |> IO.inspect(limit: :infinity, label: "newaccc") # do_flatten_error_messages(rest, [ stuff | new_acc]) # end # end # If we get an error from a nested field we should like nest the errors like so: # %DataSchema.Errors{ # errors: [ # bar: "Field was marked as not null but was found to be null.", # foo: %DataSchema.Errors{ # errors: [ # comment: "Field was marked as not null but was found to be null." # ], # } # ] # }