Packages
toon_codec
1.0.0
TOON (Token-Oriented Object Notation) encoder/decoder - a compact, token-efficient format for LLM input
Current section
Files
Jump to
Current section
Files
src/toon_codec@encode@objects.erl
-module(toon_codec@encode@objects).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/toon_codec/encode/objects.gleam").
-export([encode_object/4]).
-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(
" Object encoding functions.\n"
"\n"
" This module handles encoding of JSON objects to TOON format,\n"
" including nested objects and empty objects.\n"
" Encode an object to TOON format.\n"
"\n"
" Objects are encoded as key-value pairs at the specified depth.\n"
" Each field appears on its own line with proper indentation.\n"
"\n"
" ## Arguments\n"
"\n"
" * `fields` - List of key-value pairs\n"
" * `writer` - The line writer to append to\n"
" * `depth` - Current indentation depth\n"
" * `options` - Encoding options\n"
" Encode a single key-value pair.\n"
"\n"
" Handles primitives, nested objects, and arrays appropriately.\n"
" Encode a nested object.\n"
"\n"
" Empty objects are rendered as \"key:\" with no content below.\n"
" Non-empty objects have their fields at depth + 1.\n"
" Delegate array encoding to the arrays module.\n"
).
-file("src/toon_codec/encode/objects.gleam", 96).
-spec encode_array_for_key(
binary(),
list(toon_codec@types:json_value()),
toon_codec@encode@writer:writer(),
integer(),
toon_codec@types:encode_options()
) -> toon_codec@encode@writer:writer().
encode_array_for_key(Key, Items, Writer, Depth, Options) ->
toon_codec@encode@arrays:encode_array(
{some, Key},
Items,
Writer,
Depth,
Options
).
-file("src/toon_codec/encode/objects.gleam", 77).
-spec encode_nested_object(
binary(),
list({binary(), toon_codec@types:json_value()}),
toon_codec@encode@writer:writer(),
integer(),
toon_codec@types:encode_options()
) -> toon_codec@encode@writer:writer().
encode_nested_object(Encoded_key, Fields, Writer, Depth, Options) ->
Writer@1 = toon_codec@encode@writer:push(
Writer,
Depth,
<<Encoded_key/binary, ":"/utf8>>
),
case Fields of
[] ->
Writer@1;
_ ->
encode_object(Fields, Writer@1, Depth + 1, Options)
end.
-file("src/toon_codec/encode/objects.gleam", 34).
-spec encode_object(
list({binary(), toon_codec@types:json_value()}),
toon_codec@encode@writer:writer(),
integer(),
toon_codec@types:encode_options()
) -> toon_codec@encode@writer:writer().
encode_object(Fields, Writer, Depth, Options) ->
gleam@list:fold(
Fields,
Writer,
fun(W, Pair) ->
encode_key_value_pair(
erlang:element(1, Pair),
erlang:element(2, Pair),
W,
Depth,
Options
)
end
).
-file("src/toon_codec/encode/objects.gleam", 47).
-spec encode_key_value_pair(
binary(),
toon_codec@types:json_value(),
toon_codec@encode@writer:writer(),
integer(),
toon_codec@types:encode_options()
) -> toon_codec@encode@writer:writer().
encode_key_value_pair(Key, Value, Writer, Depth, Options) ->
Encoded_key = toon_codec@encode@primitives:encode_key(Key),
case Value of
null ->
Encoded_value = toon_codec@encode@primitives:encode_primitive(
Value,
erlang:element(3, Options)
),
Line = <<<<Encoded_key/binary, ": "/utf8>>/binary,
Encoded_value/binary>>,
toon_codec@encode@writer:push(Writer, Depth, Line);
{bool, _} ->
Encoded_value = toon_codec@encode@primitives:encode_primitive(
Value,
erlang:element(3, Options)
),
Line = <<<<Encoded_key/binary, ": "/utf8>>/binary,
Encoded_value/binary>>,
toon_codec@encode@writer:push(Writer, Depth, Line);
{number, _} ->
Encoded_value = toon_codec@encode@primitives:encode_primitive(
Value,
erlang:element(3, Options)
),
Line = <<<<Encoded_key/binary, ": "/utf8>>/binary,
Encoded_value/binary>>,
toon_codec@encode@writer:push(Writer, Depth, Line);
{string, _} ->
Encoded_value = toon_codec@encode@primitives:encode_primitive(
Value,
erlang:element(3, Options)
),
Line = <<<<Encoded_key/binary, ": "/utf8>>/binary,
Encoded_value/binary>>,
toon_codec@encode@writer:push(Writer, Depth, Line);
{array, Items} ->
encode_array_for_key(Key, Items, Writer, Depth, Options);
{object, Nested_fields} ->
encode_nested_object(
Encoded_key,
Nested_fields,
Writer,
Depth,
Options
)
end.