defmodule Jido.Chat.Errors.Validation do @moduledoc """ Schema validation error for named Jido.Chat structs. """ use Splode.Error, class: :validation, fields: [ :subject, :input, errors: [] ] @impl true def message(%__MODULE__{subject: subject, errors: errors}) do base = "invalid #{subject(subject)}" case format_errors(errors) do "" -> base detail -> "#{base}: #{detail}" end end defp subject(nil), do: "data" defp subject(value) when is_atom(value), do: inspect(value) defp subject(value), do: to_string(value) defp format_errors(errors) when is_list(errors) do errors |> Enum.map_join("; ", &format_error/1) end defp format_errors(_), do: "" defp format_error(%Zoi.Error{message: message, path: path}) do case format_path(path) do "" -> message path -> "#{path} #{message}" end end defp format_error(%{message: message}) when is_binary(message), do: message defp format_error(other), do: inspect(other) defp format_path(path) when is_list(path) and path != [] do Enum.map_join(path, ".", &to_string/1) <> ":" end defp format_path(_), do: "" end