Selecto.DomainValidator (Selecto v0.4.5)

Copy Markdown

Domain validation for Selecto configurations.

Validates domain configuration to catch errors early and prevent runtime failures. Checks for join dependency cycles, missing references, required keys for advanced join types, and other structural integrity issues.

Usage

# Validate during configure (enabled by default)
domain = %{source: ..., schemas: ..., joins: ...}
selecto = Selecto.configure(domain, postgrex_opts)

# Disable validation for performance-critical scenarios
selecto = Selecto.configure(domain, postgrex_opts, validate: false)

# Or validate explicitly
Selecto.DomainValidator.validate_domain!(domain)
{:ok, _} = Selecto.DomainValidator.validate_domain(domain)

Compile-time Validation

# Validate domain at compile time (recommended for static configurations)
defmodule MyDomain do
  use Selecto.DomainValidator, domain: %{
    source: %{...},
    schemas: %{...},
    joins: %{...}
  }
end

Summary

Functions

Compile-time domain validation macro.

Validates a domain configuration, returning {:ok, domain} or {:error, errors}.

Validates a domain configuration, raising on validation errors.

Functions

__using__(opts)

(macro)

Compile-time domain validation macro.

When used in a module, validates the provided domain configuration at compile time. This catches domain configuration errors early and provides better error messages.

Options

  • :domain - The domain configuration to validate (required)

Example

defmodule MyApp.UserDomain do
  use Selecto.DomainValidator, domain: %{
    source: %{
      source_table: "users",
      primary_key: :id,
      fields: [:id, :name, :email],
      columns: %{
        id: %{type: :integer},
        name: %{type: :string},
        email: %{type: :string}
      }
    },
    schemas: %{}
  }

  def domain, do: @validated_domain
end

format_errors(errors)

validate_domain(domain)

Validates a domain configuration, returning {:ok, domain} or {:error, errors}.

Non-raising version of validate_domain!/1.

validate_domain!(domain)

@spec validate_domain!(Selecto.Types.domain()) :: :ok

Validates a domain configuration, raising on validation errors.

Validations Performed

  • Join dependency cycle detection
  • Association existence validation
  • Schema reference validation
  • Column/field existence validation
  • Advanced join type required key validation
  • Custom column/filter reference validation

Examples

iex> domain = %{source: valid_source, schemas: valid_schemas, joins: valid_joins}
iex> Selecto.DomainValidator.validate_domain!(domain)
:ok

iex> domain = %{source: valid_source, schemas: valid_schemas, joins: cyclic_joins}
iex> Selecto.DomainValidator.validate_domain!(domain)
** (Selecto.DomainValidator.ValidationError) Join dependency cycle detected: a -> b -> c -> a