From a664778d8de3e7ed3175784963c91a98a42c824d Mon Sep 17 00:00:00 2001 From: Nick Date: Wed, 10 Sep 2025 11:35:47 +0200 Subject: [PATCH] improve error for type mismatch --- lib/open_api_spex/cast/enum.ex | 4 ++-- lib/open_api_spex/cast/error.ex | 10 ++++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/open_api_spex/cast/enum.ex b/lib/open_api_spex/cast/enum.ex index b78c146c..f3a664ff 100644 --- a/lib/open_api_spex/cast/enum.ex +++ b/lib/open_api_spex/cast/enum.ex @@ -3,8 +3,8 @@ defmodule OpenApiSpex.Cast.Enum do alias OpenApiSpex.Cast def cast(ctx = %Cast{schema: %{enum: enum}, value: value}) do - case Enum.find(enum, {:error, :invalid_enum}, &equivalent?(&1, value)) do - {:error, :invalid_enum} -> Cast.error(ctx, {:invalid_enum}) + case Enum.find(enum, {:error, :invalid_enum, enum, value}, &equivalent?(&1, value)) do + {:error, :invalid_enum, enum, value} -> Cast.error(ctx, {:invalid_enum, enum, value}) found -> {:ok, found} end end diff --git a/lib/open_api_spex/cast/error.ex b/lib/open_api_spex/cast/error.ex index 49cefec0..e2501983 100644 --- a/lib/open_api_spex/cast/error.ex +++ b/lib/open_api_spex/cast/error.ex @@ -91,6 +91,7 @@ defmodule OpenApiSpex.Cast.Error do @type t :: %__MODULE__{ reason: reason(), value: any(), + enum: any(), format: String.t(), name: String.t(), path: list(String.t()), @@ -100,6 +101,7 @@ defmodule OpenApiSpex.Cast.Error do defstruct reason: nil, value: nil, + enum: [], format: nil, type: nil, name: nil, @@ -196,8 +198,8 @@ defmodule OpenApiSpex.Cast.Error do |> add_context_fields(ctx) end - def new(ctx, {:invalid_enum}) do - %__MODULE__{reason: :invalid_enum} + def new(ctx, {:invalid_enum, enum, value}) do + %__MODULE__{reason: :invalid_enum, enum: enum, value: value} |> add_context_fields(ctx) end @@ -329,8 +331,8 @@ defmodule OpenApiSpex.Cast.Error do "Invalid format. Expected #{inspect(format)}" end - def message(%{reason: :invalid_enum}) do - "Invalid value for enum" + def message(%{reason: :invalid_enum, enum: enum, value: value}) do + "Invalid value for enum, allowed_values: #{inspect(enum)}, got: #{inspect(value)}" end def message(%{reason: :polymorphic_failed, type: polymorphic_type}) do