Config override serialization, nested map flattening, and TOML value validation.
Summary
Functions
Flattens a nested map into a list of {dotted_key, value} tuples.
Types
@type config_override() :: String.t() | {String.t(), config_override_value()}
@type config_override_value() :: config_override_scalar() | [config_override_value()] | %{optional(String.t() | atom()) => config_override_value()}
Functions
@spec cli_args([Codex.Thread.Options.config_override()]) :: [String.t()]
@spec derived_overrides(Codex.Options.t(), Codex.Thread.Options.t() | nil) :: [ {String.t(), term()} ]
Flattens a nested map into a list of {dotted_key, value} tuples.
Nested maps are recursively traversed and their keys are joined with dots. Non-map leaf values are kept as-is.
Examples
iex> Codex.Config.Overrides.flatten_config_map(%{"model" => %{"personality" => "friendly"}})
[{"model.personality", "friendly"}]
iex> Codex.Config.Overrides.flatten_config_map(%{"timeout" => 5000})
[{"timeout", 5000}]
@spec merge_config(map() | nil, Codex.Options.t(), Codex.Thread.Options.t()) :: map() | nil
@spec normalize_config_overrides(term()) :: {:ok, [config_override()]} | {:error, term()}