Configuration management for DprintMarkdownFormatter with proper type safety and validation.
Summary
Functions
Returns the default configuration.
Returns the default list of module attributes that are formatted when
format_module_attributes: true.
Creates a configuration struct from a keyword list with validation.
Loads and validates configuration from Mix.Project.config().
Merges a configuration struct with runtime options.
Resolves module attributes configuration to a list of atoms.
Returns a map with only the dprint-related fields for the NIF.
Types
@type t() :: %DprintMarkdownFormatter.Config{ emphasis_kind: emphasis_kind_option(), format_module_attributes: module_attributes_option(), heading_kind: heading_kind_option(), line_width: pos_integer(), list_indent_kind: list_indent_kind_option(), new_line_kind: new_line_kind_option(), strong_kind: strong_kind_option(), text_wrap: text_wrap_option(), unordered_list_kind: unordered_list_kind_option() }
Functions
@spec default() :: t()
Returns the default configuration.
Examples
iex> DprintMarkdownFormatter.Config.default()
%DprintMarkdownFormatter.Config{
line_width: 80,
text_wrap: :always,
emphasis_kind: :asterisks,
strong_kind: :asterisks,
new_line_kind: :auto,
unordered_list_kind: :dashes,
heading_kind: :atx,
list_indent_kind: :common_mark,
format_module_attributes: nil
}
@spec default_doc_attributes() :: [atom()]
Returns the default list of module attributes that are formatted when
format_module_attributes: true.
Creates a configuration struct from a keyword list with validation.
Examples
iex> DprintMarkdownFormatter.Config.from_keyword([line_width: 100])
%DprintMarkdownFormatter.Config{line_width: 100}
iex> DprintMarkdownFormatter.Config.from_keyword([text_wrap: :never])
%DprintMarkdownFormatter.Config{text_wrap: :never}
iex> DprintMarkdownFormatter.Config.from_keyword([format_module_attributes: true])
%DprintMarkdownFormatter.Config{format_module_attributes: true}
iex> DprintMarkdownFormatter.Config.from_keyword([heading_kind: :setext]).heading_kind
:setext
iex> DprintMarkdownFormatter.Config.from_keyword([heading_kind: "setext"]).heading_kind
:setext
iex> DprintMarkdownFormatter.Config.from_keyword([heading_kind: "atx"]).heading_kind
:atx
iex> DprintMarkdownFormatter.Config.from_keyword([heading_kind: :invalid]).heading_kind
:atx
@spec load() :: t()
Loads and validates configuration from Mix.Project.config().
Returns a validated configuration struct with proper type checking. Invalid values are replaced with defaults and warnings are logged.
Examples
# With valid configuration in mix.exs
DprintMarkdownFormatter.Config.load()
#=> %DprintMarkdownFormatter.Config{line_width: 80, text_wrap: :always}
Merges a configuration struct with runtime options.
Runtime options take precedence over configuration values. Only valid options are merged; invalid options are ignored with a warning.
Examples
iex> config = %DprintMarkdownFormatter.Config{line_width: 80}
iex> DprintMarkdownFormatter.Config.merge(config, [line_width: 100])
%DprintMarkdownFormatter.Config{line_width: 100}
iex> config = %DprintMarkdownFormatter.Config{text_wrap: :always}
iex> DprintMarkdownFormatter.Config.merge(config, [text_wrap: :never, line_width: 120])
%DprintMarkdownFormatter.Config{text_wrap: :never, line_width: 120}
iex> config = %DprintMarkdownFormatter.Config{heading_kind: :atx}
iex> DprintMarkdownFormatter.Config.merge(config, [heading_kind: :setext]).heading_kind
:setext
Resolves module attributes configuration to a list of atoms.
Examples
iex> config = %DprintMarkdownFormatter.Config{format_module_attributes: true}
iex> DprintMarkdownFormatter.Config.resolve_module_attributes(config)
[:moduledoc, :doc, :typedoc, :shortdoc, :deprecated]
iex> config = %DprintMarkdownFormatter.Config{format_module_attributes: [:custom]}
iex> DprintMarkdownFormatter.Config.resolve_module_attributes(config)
[:custom]
iex> config = %DprintMarkdownFormatter.Config{format_module_attributes: nil}
iex> DprintMarkdownFormatter.Config.resolve_module_attributes(config)
[]
@spec to_nif_config(t()) :: nif_config_map()
Returns a map with only the dprint-related fields for the NIF.
Excludes format_module_attributes which is only used by Elixir code. This map is passed directly to the Rust NIF for formatting.
Examples
iex> config = %DprintMarkdownFormatter.Config{line_width: 100, text_wrap: :never}
iex> DprintMarkdownFormatter.Config.to_nif_config(config)
%{
line_width: 100,
text_wrap: :never,
emphasis_kind: :asterisks,
strong_kind: :asterisks,
new_line_kind: :auto,
unordered_list_kind: :dashes,
heading_kind: :atx,
list_indent_kind: :common_mark
}