Exdantic.Config.Builder (exdantic v0.0.2)

View Source

Fluent builder for creating Exdantic configurations.

This module provides a chainable API for building complex configurations in a readable and intuitive way.

Summary

Functions

Convenience method to enable aggressive coercion.

Convenience method to allow extra fields.

Applies a preset configuration to the builder.

Builds the final configuration from the builder.

Convenience method to disable case sensitivity.

Sets case sensitivity for field names.

Clones a builder instance.

Sets the coercion strategy.

Sets a custom description generator function.

Convenience method to set detailed error format.

Sets the error format style.

Sets how extra fields should be handled.

Creates a configuration for API validation scenarios.

Creates a configuration for development scenarios.

Creates a configuration for JSON Schema generation scenarios.

Creates a configuration for production scenarios.

Convenience method to forbid extra fields.

Sets whether the configuration should be frozen (immutable).

Sets the maximum length for anyOf unions in JSON Schema.

Merges additional options into the builder.

Creates a new configuration builder.

Convenience method to disable coercion.

Resets the builder to an empty state.

Convenience method to enable safe coercion.

Convenience method to set simple error format.

Sets strict validation mode.

Returns a summary of the current builder configuration.

Sets a custom title generator function.

Sets whether to use enum values instead of names.

Validates the builder configuration before building.

Sets whether to validate field assignments.

Applies configuration only if a condition is false.

Conditionally applies a configuration based on a predicate.

Types

t()

@type t() :: %Exdantic.Config.Builder{opts: map()}

Functions

aggressive_coercion(builder)

Convenience method to enable aggressive coercion.

Parameters

  • builder - The builder instance

Returns

  • Updated builder instance

Examples

iex> builder |> Exdantic.Config.Builder.aggressive_coercion()
%Exdantic.Config.Builder{opts: %{coercion: :aggressive}}

allow_extra(builder)

Convenience method to allow extra fields.

Parameters

  • builder - The builder instance

Returns

  • Updated builder instance

Examples

iex> builder |> Exdantic.Config.Builder.allow_extra()
%Exdantic.Config.Builder{opts: %{extra: :allow}}

apply_preset(builder, preset)

@spec apply_preset(t(), atom()) :: t()

Applies a preset configuration to the builder.

Parameters

  • builder - The builder instance
  • preset - The preset name (same as Exdantic.Config.preset/1)

Returns

  • Updated builder instance

Examples

iex> builder |> Exdantic.Config.Builder.apply_preset(:strict)
%Exdantic.Config.Builder{opts: %{strict: true, extra: :forbid, ...}}

build(builder)

@spec build(t()) :: Exdantic.Config.t()

Builds the final configuration from the builder.

Parameters

  • builder - The builder instance

Returns

  • Exdantic.Config struct with the configured options

Examples

iex> config = Exdantic.Config.Builder.new()
...> |> Exdantic.Config.Builder.strict()
...> |> Exdantic.Config.Builder.forbid_extra()
...> |> Exdantic.Config.Builder.build()
%Exdantic.Config{strict: true, extra: :forbid, ...}

case_insensitive(builder)

Convenience method to disable case sensitivity.

Parameters

  • builder - The builder instance

Returns

  • Updated builder instance

Examples

iex> builder |> Exdantic.Config.Builder.case_insensitive()
%Exdantic.Config.Builder{opts: %{case_sensitive: false}}

case_sensitive(builder, enabled \\ true)

@spec case_sensitive(t(), boolean()) :: t()

Sets case sensitivity for field names.

Parameters

  • builder - The builder instance
  • enabled - Whether to enable case sensitivity (default: true)

Returns

  • Updated builder instance

Examples

iex> builder |> Exdantic.Config.Builder.case_sensitive()
%Exdantic.Config.Builder{opts: %{case_sensitive: true}}

iex> builder |> Exdantic.Config.Builder.case_sensitive(false)
%Exdantic.Config.Builder{opts: %{case_sensitive: false}}

clone(builder)

@spec clone(t()) :: t()

Clones a builder instance.

Parameters

  • builder - The builder instance to clone

Returns

  • New builder instance with the same configuration

Examples

iex> original = Exdantic.Config.Builder.new() |> Exdantic.Config.Builder.strict()
iex> cloned = Exdantic.Config.Builder.clone(original)
%Exdantic.Config.Builder{opts: %{strict: true}}

coercion(builder, strategy)

@spec coercion(t(), Exdantic.Config.coercion_strategy()) :: t()

Sets the coercion strategy.

Parameters

  • builder - The builder instance
  • strategy - The coercion strategy (:none, :safe, :aggressive)

Returns

  • Updated builder instance

Examples

iex> builder |> Exdantic.Config.Builder.coercion(:safe)
%Exdantic.Config.Builder{opts: %{coercion: :safe}}

description_generator(builder, generator_fn)

@spec description_generator(t(), (atom() -> String.t())) :: t()

Sets a custom description generator function.

Parameters

  • builder - The builder instance
  • generator_fn - Function that takes a field name and returns a description

Returns

  • Updated builder instance

Examples

iex> desc_fn = fn field -> "Field for " <> Atom.to_string(field) end
iex> builder |> Exdantic.Config.Builder.description_generator(desc_fn)
%Exdantic.Config.Builder{opts: %{description_generator: #Function<...>}}

detailed_errors(builder)

Convenience method to set detailed error format.

Parameters

  • builder - The builder instance

Returns

  • Updated builder instance

Examples

iex> builder |> Exdantic.Config.Builder.detailed_errors()
%Exdantic.Config.Builder{opts: %{error_format: :detailed}}

error_format(builder, format)

@spec error_format(t(), Exdantic.Config.error_format()) :: t()

Sets the error format style.

Parameters

  • builder - The builder instance
  • format - The error format (:detailed, :simple, :minimal)

Returns

  • Updated builder instance

Examples

iex> builder |> Exdantic.Config.Builder.error_format(:simple)
%Exdantic.Config.Builder{opts: %{error_format: :simple}}

extra(builder, strategy)

@spec extra(t(), Exdantic.Config.extra_strategy()) :: t()

Sets how extra fields should be handled.

Parameters

  • builder - The builder instance
  • strategy - The extra field strategy (:allow, :forbid, :ignore)

Returns

  • Updated builder instance

Examples

iex> builder |> Exdantic.Config.Builder.extra(:forbid)
%Exdantic.Config.Builder{opts: %{extra: :forbid}}

for_api(builder)

Creates a configuration for API validation scenarios.

Parameters

  • builder - The builder instance

Returns

  • Updated builder instance with API-friendly settings

Examples

iex> builder |> Exdantic.Config.Builder.for_api()
%Exdantic.Config.Builder{opts: %{strict: true, extra: :forbid, ...}}

for_development(builder)

Creates a configuration for development scenarios.

Parameters

  • builder - The builder instance

Returns

  • Updated builder instance with development-friendly settings

Examples

iex> builder |> Exdantic.Config.Builder.for_development()
%Exdantic.Config.Builder{opts: %{strict: false, coercion: :aggressive, ...}}

for_json_schema(builder)

Creates a configuration for JSON Schema generation scenarios.

Parameters

  • builder - The builder instance

Returns

  • Updated builder instance with JSON Schema-friendly settings

Examples

iex> builder |> Exdantic.Config.Builder.for_json_schema()
%Exdantic.Config.Builder{opts: %{use_enum_values: true, error_format: :minimal, ...}}

for_production(builder)

Creates a configuration for production scenarios.

Parameters

  • builder - The builder instance

Returns

  • Updated builder instance with production-ready settings

Examples

iex> builder |> Exdantic.Config.Builder.for_production()
%Exdantic.Config.Builder{opts: %{strict: true, frozen: true, ...}}

forbid_extra(builder)

Convenience method to forbid extra fields.

Parameters

  • builder - The builder instance

Returns

  • Updated builder instance

Examples

iex> builder |> Exdantic.Config.Builder.forbid_extra()
%Exdantic.Config.Builder{opts: %{extra: :forbid}}

frozen(builder, enabled \\ true)

@spec frozen(t(), boolean()) :: t()

Sets whether the configuration should be frozen (immutable).

Parameters

  • builder - The builder instance
  • enabled - Whether to freeze the config (default: true)

Returns

  • Updated builder instance

Examples

iex> builder |> Exdantic.Config.Builder.frozen()
%Exdantic.Config.Builder{opts: %{frozen: true}}

max_union_length(builder, max_length)

@spec max_union_length(t(), non_neg_integer()) :: t()

Sets the maximum length for anyOf unions in JSON Schema.

Parameters

  • builder - The builder instance
  • max_length - Maximum union length

Returns

  • Updated builder instance

Examples

iex> builder |> Exdantic.Config.Builder.max_union_length(3)
%Exdantic.Config.Builder{opts: %{max_anyof_union_len: 3}}

merge(builder, opts)

@spec merge(t(), map() | keyword()) :: t()

Merges additional options into the builder.

Parameters

  • builder - The builder instance
  • opts - Additional options to merge

Returns

  • Updated builder instance

Examples

iex> builder |> Exdantic.Config.Builder.merge(%{strict: true, frozen: true})
%Exdantic.Config.Builder{opts: %{strict: true, frozen: true}}

new()

@spec new() :: %Exdantic.Config.Builder{opts: %{}}

Creates a new configuration builder.

Returns

  • New ConfigBuilder instance

Examples

iex> builder = Exdantic.Config.Builder.new()
%Exdantic.Config.Builder{opts: %{}}

no_coercion(builder)

Convenience method to disable coercion.

Parameters

  • builder - The builder instance

Returns

  • Updated builder instance

Examples

iex> builder |> Exdantic.Config.Builder.no_coercion()
%Exdantic.Config.Builder{opts: %{coercion: :none}}

reset(builder)

@spec reset(t()) :: t()

Resets the builder to an empty state.

Parameters

  • builder - The builder instance

Returns

  • Reset builder instance

Examples

iex> builder = Exdantic.Config.Builder.new() |> Exdantic.Config.Builder.strict()
iex> reset_builder = Exdantic.Config.Builder.reset(builder)
%Exdantic.Config.Builder{opts: %{}}

safe_coercion(builder)

Convenience method to enable safe coercion.

Parameters

  • builder - The builder instance

Returns

  • Updated builder instance

Examples

iex> builder |> Exdantic.Config.Builder.safe_coercion()
%Exdantic.Config.Builder{opts: %{coercion: :safe}}

simple_errors(builder)

Convenience method to set simple error format.

Parameters

  • builder - The builder instance

Returns

  • Updated builder instance

Examples

iex> builder |> Exdantic.Config.Builder.simple_errors()
%Exdantic.Config.Builder{opts: %{error_format: :simple}}

strict(builder, enabled \\ true)

@spec strict(t(), boolean()) :: t()

Sets strict validation mode.

Parameters

  • builder - The builder instance
  • enabled - Whether to enable strict mode (default: true)

Returns

  • Updated builder instance

Examples

iex> builder |> Exdantic.Config.Builder.strict()
%Exdantic.Config.Builder{opts: %{strict: true}}

iex> builder |> Exdantic.Config.Builder.strict(false)
%Exdantic.Config.Builder{opts: %{strict: false}}

summary(builder)

@spec summary(t()) :: map()

Returns a summary of the current builder configuration.

Parameters

  • builder - The builder instance

Returns

  • Map with current configuration options

Examples

iex> builder = Exdantic.Config.Builder.new() |> Exdantic.Config.Builder.strict()
iex> Exdantic.Config.Builder.summary(builder)
%{options_set: [:strict], option_count: 1, ready_to_build: true}

title_generator(builder, generator_fn)

@spec title_generator(t(), (atom() -> String.t())) :: t()

Sets a custom title generator function.

Parameters

  • builder - The builder instance
  • generator_fn - Function that takes a field name and returns a title

Returns

  • Updated builder instance

Examples

iex> title_fn = fn field -> field |> Atom.to_string() |> String.capitalize() end
iex> builder |> Exdantic.Config.Builder.title_generator(title_fn)
%Exdantic.Config.Builder{opts: %{title_generator: #Function<...>}}

use_enum_values(builder, enabled \\ true)

@spec use_enum_values(t(), boolean()) :: t()

Sets whether to use enum values instead of names.

Parameters

  • builder - The builder instance
  • enabled - Whether to use enum values (default: true)

Returns

  • Updated builder instance

Examples

iex> builder |> Exdantic.Config.Builder.use_enum_values()
%Exdantic.Config.Builder{opts: %{use_enum_values: true}}

validate_and_build(builder)

@spec validate_and_build(t()) :: {:ok, Exdantic.Config.t()} | {:error, [String.t()]}

Validates the builder configuration before building.

Parameters

  • builder - The builder instance

Returns

  • {:ok, config} if valid
  • {:error, reasons} if invalid

Examples

iex> valid_builder = Exdantic.Config.Builder.new() |> Exdantic.Config.Builder.strict()
iex> Exdantic.Config.Builder.validate_and_build(valid_builder)
{:ok, %Exdantic.Config{...}}

iex> invalid_builder = Exdantic.Config.Builder.new()
...> |> Exdantic.Config.Builder.strict()
...> |> Exdantic.Config.Builder.allow_extra()
iex> Exdantic.Config.Builder.validate_and_build(invalid_builder)
{:error, ["strict mode conflicts with extra: :allow"]}

validate_assignment(builder, enabled \\ true)

@spec validate_assignment(t(), boolean()) :: t()

Sets whether to validate field assignments.

Parameters

  • builder - The builder instance
  • enabled - Whether to enable assignment validation (default: true)

Returns

  • Updated builder instance

Examples

iex> builder |> Exdantic.Config.Builder.validate_assignment()
%Exdantic.Config.Builder{opts: %{validate_assignment: true}}

when_false(builder, condition, config_fn)

@spec when_false(t(), boolean() | (-> boolean()), (t() -> t())) :: t()

Applies configuration only if a condition is false.

Parameters

  • builder - The builder instance
  • condition - Boolean condition or function that returns boolean
  • config_fn - Function to apply if condition is false

Returns

  • Updated builder instance

Examples

iex> is_development = Application.get_env(:my_app, :env) == :dev
iex> builder |> Exdantic.Config.Builder.when_false(is_development, &Exdantic.Config.Builder.frozen/1)
%Exdantic.Config.Builder{...}

when_true(builder, condition, config_fn)

@spec when_true(t(), boolean() | (-> boolean()), (t() -> t())) :: t()

Conditionally applies a configuration based on a predicate.

Parameters

  • builder - The builder instance
  • condition - Boolean condition or function that returns boolean
  • config_fn - Function to apply if condition is true

Returns

  • Updated builder instance

Examples

iex> is_production = Application.get_env(:my_app, :env) == :prod
iex> builder |> Exdantic.Config.Builder.when_true(is_production, &Exdantic.Config.Builder.frozen/1)
%Exdantic.Config.Builder{...}

iex> builder |> Exdantic.Config.Builder.when_true(true, fn b ->
...>   b |> Exdantic.Config.Builder.strict() |> Exdantic.Config.Builder.forbid_extra()
...> end)
%Exdantic.Config.Builder{opts: %{strict: true, extra: :forbid}}