Advanced configuration with runtime modification support.
This module provides functionality for creating and manipulating validation
configuration at runtime, supporting the DSPy pattern of dynamic config
modification like ConfigDict(extra="forbid", frozen=True).
Summary
Functions
Checks if extra fields should be allowed based on configuration.
Creates a builder for fluent configuration creation.
Gets the coercion aggressiveness level.
Creates a new configuration with the specified options.
Creates a configuration optimized for Phase 6 enhanced features.
Creates a preset configuration for DSPy integration.
Merges configuration options with an existing config.
Creates a preset configuration for common validation scenarios.
Checks if type coercion should be performed based on configuration.
Returns a summary of the configuration settings.
Converts configuration to options suitable for JSON Schema generation.
Converts configuration to options suitable for validation functions.
Validates configuration options for consistency.
Types
@type coercion_strategy() :: :none | :safe | :aggressive
@type error_format() :: :detailed | :simple | :minimal
@type extra_strategy() :: :allow | :forbid | :ignore
@type t() :: %Exdantic.Config{ allow_population_by_field_name: boolean(), case_sensitive: boolean(), coercion: coercion_strategy(), description_generator: (atom() -> String.t()) | nil, error_format: error_format(), extra: extra_strategy(), frozen: boolean(), max_anyof_union_len: non_neg_integer(), strict: boolean(), title_generator: (atom() -> String.t()) | nil, use_enum_values: boolean(), validate_assignment: boolean() }
Functions
Checks if extra fields should be allowed based on configuration.
Parameters
config- The configuration to check
Returns
trueif extra fields are allowed,falseotherwise
Examples
iex> config = Exdantic.Config.create(extra: :allow)
iex> Exdantic.Config.allow_extra_fields?(config)
true
iex> config = Exdantic.Config.create(extra: :forbid)
iex> Exdantic.Config.allow_extra_fields?(config)
false
@spec builder() :: Exdantic.Config.Builder.t()
Creates a builder for fluent configuration creation.
Returns
- ConfigBuilder struct for chaining configuration calls
Examples
iex> config = Exdantic.Config.builder()
...> |> Exdantic.Config.Builder.strict(true)
...> |> Exdantic.Config.Builder.forbid_extra()
...> |> Exdantic.Config.Builder.safe_coercion()
...> |> Exdantic.Config.Builder.build()
%Exdantic.Config{strict: true, extra: :forbid, coercion: :safe, ...}
@spec coercion_level(t()) :: coercion_strategy()
Gets the coercion aggressiveness level.
Parameters
config- The configuration to check
Returns
- Coercion strategy atom
Examples
iex> config = Exdantic.Config.create(coercion: :aggressive)
iex> Exdantic.Config.coercion_level(config)
:aggressive
Creates a new configuration with the specified options.
Parameters
opts- Configuration options as keyword list or map
Options
:strict- Enforce strict validation (default: false):extra- How to handle extra fields (default: :allow):coercion- Type coercion strategy (default: :safe):frozen- Whether the config is immutable (default: false):validate_assignment- Validate field assignments (default: false):error_format- Error format style (default: :detailed)
Returns
- New Config struct
Examples
iex> config = Exdantic.Config.create(strict: true, extra: :forbid)
iex> config.strict
true
iex> config = Exdantic.Config.create(%{coercion: :aggressive, frozen: true})
iex> config.coercion
:aggressive
Creates a configuration optimized for Phase 6 enhanced features.
Phase 6 Enhancement: Configuration that supports all new features and LLM optimizations.
Parameters
opts- Configuration options with Phase 6 enhancements
Phase 6 Options
:llm_provider- Target LLM provider for optimization (:openai, :anthropic, :generic):dspy_compatible- Ensure DSPy compatibility (default: false):enhanced_validation- Enable enhanced validation pipeline (default: true):include_metadata- Include enhanced metadata in schemas (default: true):performance_mode- Optimize for performance (:speed, :memory, :balanced)
Examples
iex> config = Exdantic.Config.create_enhanced(%{
...> llm_provider: :openai,
...> dspy_compatible: true,
...> performance_mode: :balanced
...> })
%Exdantic.Config{...}
Creates a preset configuration for DSPy integration.
Phase 6 Enhancement: Specialized configuration for DSPy patterns.
Parameters
dspy_mode- DSPy usage pattern (:signature, :chain_of_thought, :input_output, :general)opts- Additional configuration options
Examples
iex> config = Exdantic.Config.for_dspy(:signature, provider: :openai)
%Exdantic.Config{strict: true, extra: :forbid, ...}
Merges configuration options with an existing config.
Parameters
base_config- The base configurationoverrides- Configuration options to merge/override
Returns
- New Config struct with merged options
- Raises if base config is frozen and overrides are provided
Examples
iex> base = Exdantic.Config.create(strict: true)
iex> merged = Exdantic.Config.merge(base, %{extra: :forbid, coercion: :none})
%Exdantic.Config{strict: true, extra: :forbid, coercion: :none, ...}
iex> frozen = Exdantic.Config.create(frozen: true)
iex> Exdantic.Config.merge(frozen, %{strict: true})
** (RuntimeError) Cannot modify frozen configuration
@spec preset(:strict | :lenient | :api | :json_schema | :development | :production) :: t()
Creates a preset configuration for common validation scenarios.
Parameters
preset- The preset name
Available Presets
:strict- Strict validation with no extra fields:lenient- Lenient validation allowing extra fields:api- Configuration suitable for API validation:json_schema- Configuration optimized for JSON Schema generation:development- Development-friendly configuration:production- Production-ready configuration
Returns
- Pre-configured Config struct
Examples
iex> Exdantic.Config.preset(:strict)
%Exdantic.Config{strict: true, extra: :forbid, coercion: :none, ...}
iex> Exdantic.Config.preset(:lenient)
%Exdantic.Config{strict: false, extra: :allow, coercion: :safe, ...}
Checks if type coercion should be performed based on configuration.
Parameters
config- The configuration to check
Returns
trueif coercion should be performed,falseotherwise
Examples
iex> config = Exdantic.Config.create(coercion: :safe)
iex> Exdantic.Config.should_coerce?(config)
true
iex> config = Exdantic.Config.create(coercion: :none)
iex> Exdantic.Config.should_coerce?(config)
false
@spec summary(t()) :: %{ validation_mode: String.t(), extra_fields: String.t(), coercion: String.t(), frozen: boolean(), error_format: String.t(), features: [String.t()] }
Returns a summary of the configuration settings.
Parameters
config- The configuration to summarize
Returns
- Map with configuration summary
Examples
iex> config = Exdantic.Config.create(strict: true, extra: :forbid)
iex> Exdantic.Config.summary(config)
%{
validation_mode: "strict",
extra_fields: "forbidden",
coercion: "safe",
frozen: false,
features: ["validate_assignment", ...]
}
Converts configuration to options suitable for JSON Schema generation.
Parameters
config- The configuration to convert
Returns
- Keyword list of JSON Schema options
Examples
iex> config = Exdantic.Config.create(strict: true, use_enum_values: true)
iex> Exdantic.Config.to_json_schema_opts(config)
[strict: true, use_enum_values: true, max_anyof_union_len: 5, ...]
Converts configuration to options suitable for validation functions.
Parameters
config- The configuration to convert
Returns
- Keyword list of validation options
Examples
iex> config = Exdantic.Config.create(strict: true, coercion: :safe)
iex> Exdantic.Config.to_validation_opts(config)
[strict: true, coerce: true, error_format: :detailed, ...]
Validates configuration options for consistency.
Parameters
config- The configuration to validate
Returns
:okif configuration is valid{:error, reasons}if configuration has issues
Examples
iex> config = Exdantic.Config.create(strict: true, extra: :allow)
iex> Exdantic.Config.validate_config(config)
{:error, ["strict mode conflicts with extra: :allow"]}
iex> config = Exdantic.Config.create(strict: true, extra: :forbid)
iex> Exdantic.Config.validate_config(config)
:ok