Skip to main content

src/molt@ops.erl

-module(molt@ops).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/molt/ops.gleam").
-export_type([operation/0, form/0, conflict_strategy/0, comments/0]).

-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.

?MODULEDOC(
    " molt/ops: Operation types for document manipulation.\n"
    "\n"
    " The types declared in this module offer document manipulation options for\n"
    " use in `molt.run` batches.\n"
    "\n"
    " ## Path Resolution Targets\n"
    "\n"
    " The `path` string provided to operations resolves against a logical version\n"
    " of the document's concrete syntax tree so that implicit nodes and value\n"
    " nodes may be modified. The shape of the targeted document node determines\n"
    " which operations are legal and what side-effects occur.\n"
    "\n"
    " - Concrete tables: tables defined by explicit headers, such as `[header]`\n"
    "   or `[database.connection]`.\n"
    "\n"
    " - Implicit tables: tables whose existence are implied by dotted key or\n"
    "   sub-header references. In `[database.connection]`, `database` is an\n"
    "   implicit table, as is `package` for a dotted key definition of:\n"
    "   `package.type = \"gleam\"`.\n"
    "\n"
    " - Array of tables: a collection of tables identified by `[[name]]` headers.\n"
    "   Paths may resolve to the collection by omitting index references\n"
    "   (`custom.plugins` referencing `[[custom.plugins]]`) and individual table\n"
    "   entries within the collection with index references (`custom.plugins[1]`\n"
    "   resolving to the second table in the collection).\n"
    "\n"
    " - Key/value nodes: a leaf assignment (`key = value`). The value may be\n"
    "   a scalar value (integer, float, string, etc.), an inline table, or an\n"
    "   array.\n"
    "\n"
    " - Inline table nodes: a table written using the inline table syntax\n"
    "   (`key = { … }`) that is part of a key/value node. Path strings may\n"
    "   extend into the inline table.\n"
    "\n"
    " - Arrays: a value node that may represent heterogenous TOML values. Path\n"
    "   strings allow resolution to the array or elements within an array using\n"
    "   the same syntax as array of table references.\n"
    "\n"
    " If an operation indicates that it works on a table-like path, it means that\n"
    " it may operate on concrete tables, implicit tables, or an array of tables\n"
    " entry.\n"
    "\n"
    " ## Operation Values\n"
    "\n"
    " Many operations work with `Value`s from `molt/value`, a comprehensive\n"
    " representation of TOML values that does not preserve comments or\n"
    " formatting.\n"
    "\n"
    " If an operation indicates that it works with a table-like value, it means\n"
    " that it will work with a Value representing an inline table or a concrete\n"
    " table's values.\n"
).

-type operation() :: {append, binary(), molt@value:value()} |
    {concat, binary(), list(molt@value:value())} |
    {ensure_exists, binary(), molt@types:toml_kind()} |
    {insert, binary(), integer(), molt@value:value()} |
    {insert_key, binary(), binary(), binary(), molt@value:value()} |
    {merge_values,
        binary(),
        list({binary(), molt@value:value()}),
        conflict_strategy()} |
    {move, binary(), binary()} |
    {move_comments, binary(), binary()} |
    {move_keys, binary(), binary(), list(binary()), conflict_strategy()} |
    {place, binary(), molt@value:value()} |
    {remove, binary()} |
    {rename, binary(), binary()} |
    {representation, binary(), form()} |
    {set, binary(), molt@value:value()} |
    {set_comments, binary(), comments()} |
    {transfer, binary(), binary(), conflict_strategy()} |
    {update,
        binary(),
        fun((molt@value:value()) -> {ok, molt@value:value()} |
            {error, molt@error:molt_error()})}.

-type form() :: block | inline.

-type conflict_strategy() :: on_conflict_error |
    on_conflict_overwrite |
    on_conflict_skip.

-type comments() :: {comments, list(binary()), gleam@option:option(binary())}.