Represents a validation in Ash.
See Ash.Resource.Validation.Builtins for a list of builtin validations.
To write your own validation, define a module that implements the init/1 callback
to validate options at compile time, and validate/3 callback to do the validation.
Then, in a resource, you can say:
validations do
validate {MyValidation, [foo: :bar]}
end
Summary
Callbacks
Whether or not batch callbacks should be run (if they are defined). Defaults to true.
Replaces validate/3 for batch actions, allowing to optimize validations for bulk actions.
Types
@type t() :: %Ash.Resource.Validation{ __spark_metadata__: Spark.Dsl.Entity.spark_meta(), always_atomic?: term(), before_action?: term(), description: String.t() | nil, message: term(), module: atom(), on: [atom()], only_when_valid?: boolean(), opts: [atom()], validation: {atom(), [atom()]}, where: [{atom(), [atom()]}] }
Callbacks
@callback atomic( changeset_query_or_input :: Ash.Changeset.t() | Ash.ActionInput.t(), opts :: Keyword.t(), context :: Ash.Resource.Validation.Context.t() ) :: :ok | {:atomic, involved_fields :: [atom()] | :*, condition_expr :: Ash.Expr.t(), error_expr :: Ash.Expr.t()} | [ {:atomic, involved_fields :: [atom()] | :*, condition_expr :: Ash.Expr.t(), error_expr :: Ash.Expr.t()} ] | {:not_atomic, String.t()} | {:error, term()}
@callback atomic?() :: boolean()
@callback batch_callbacks?( changesets_or_query :: [Ash.Changeset.t()] | Ash.Query.t(), opts :: Keyword.t(), context :: Ash.Resource.Validation.Context.t() ) :: boolean()
Whether or not batch callbacks should be run (if they are defined). Defaults to true.
@callback batch_validate( changesets :: [Ash.Changeset.t()], opts :: Keyword.t(), context :: Ash.Resource.Validation.Context.t() ) :: Enumerable.t(Ash.Changeset.t())
Replaces validate/3 for batch actions, allowing to optimize validations for bulk actions.
Receives all changesets in the batch and returns them with errors added to any that
fail validation. Unlike validate/3 which returns :ok | {:error, term}, this callback
returns the changesets directly (with errors already added via Ash.Changeset.add_error/2).
@callback has_batch_validate?() :: boolean()
@callback has_validate?() :: boolean()
@callback supports(opts :: Keyword.t()) :: [Ash.Changeset | Ash.Query | Ash.ActionInput]
@callback validate( changeset_query_or_input :: Ash.Changeset.t() | Ash.ActionInput.t(), opts :: Keyword.t(), context :: Ash.Resource.Validation.Context.t() ) :: :ok | {:error, term()}