Recursively casts scalar values, arrays, and objects according to normalized type definitions.
This low-level module is shared by ExParamsSchema.Parser and default-value compilation.
Use ExParamsSchema.parse/2 for normal input casting.
Summary
Functions
Casts a value to a normalized type.
Types
@type cast_error_path() :: [ExParamsSchema.ValidationError.path_segment()]
@type collected_detailed_cast_result() :: {:ok, ExParamsSchema.value()} | {:error, [ExParamsSchema.ValidationError.t()]}
@type collected_field_cast_result() :: {:ok, name :: atom(), value :: ExParamsSchema.value()} | {:error, [ExParamsSchema.ValidationError.t()]}
@type detailed_cast_result() :: {:ok, ExParamsSchema.value()} | {:error, {path :: cast_error_path(), reason :: ExParamsSchema.error_reason()} | ExParamsSchema.ValidationError.t()}
@type field_cast_result() :: {:ok, name :: atom(), value :: ExParamsSchema.value()} | {:error, {path :: cast_error_path(), reason :: ExParamsSchema.error_reason()} | ExParamsSchema.ValidationError.t()}
Functions
@spec cast( ExParamsSchema.value(), ExParamsSchema.Definition.Field.normalized_type(), ExParamsSchema.field_options(), ExParamsSchema.error_reason() ) :: ExParamsSchema.Caster.cast_result()
Casts a value to a normalized type.
iex> ExParamsSchema.ValueCaster.cast(["1", 2], {:array, :integer, []}, [], :invalid_items)
{:ok, [1, 2]}
iex> fields = ExParamsSchema.Definition.compile_fields!([{:count, :integer, []}])
iex> ExParamsSchema.ValueCaster.cast(%{"count" => "3"}, {:object, fields}, [], :invalid_payload)
{:ok, %{count: 3}}Returns nil unchanged when nullable: true. Values that cannot be cast are normalized to the
supplied error reason.
iex> ExParamsSchema.ValueCaster.cast(nil, :integer, [nullable: true], :invalid_count)
{:ok, nil}
iex> ExParamsSchema.ValueCaster.cast("x", :integer, [], :invalid_count)
{:error, :invalid_count}