Packages

TOON (Token-Oriented Object Notation) encoder/decoder - a compact, token-efficient format for LLM input

Current section

Files

Jump to
toon_codec src toon_codec@encode.erl
Raw

src/toon_codec@encode.erl

-module(toon_codec@encode).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/toon_codec/encode.gleam").
-export([encode_value/2]).
-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(
" Main encoding module for converting JSON values to TOON format.\n"
"\n"
" This module provides the primary encoding function that coordinates\n"
" the encoding of any JSON value to TOON format.\n"
" Encode a JSON value to TOON format string.\n"
"\n"
" This is the main entry point for encoding. It handles all JSON value types:\n"
" - Primitives (null, booleans, numbers, strings)\n"
" - Arrays (inline, tabular, or expanded)\n"
" - Objects (flat or nested)\n"
"\n"
" ## Examples\n"
"\n"
" ```gleam\n"
" // Simple object\n"
" let value = Object([\n"
" #(\"name\", JsonString(\"Alice\")),\n"
" #(\"age\", Number(30.0)),\n"
" ])\n"
" encode_value(value, default_encode_options())\n"
" // -> \"name: Alice\\nage: 30\"\n"
"\n"
" // Nested object\n"
" let value = Object([\n"
" #(\"user\", Object([\n"
" #(\"id\", Number(1.0)),\n"
" #(\"name\", JsonString(\"Bob\")),\n"
" ])),\n"
" ])\n"
" encode_value(value, default_encode_options())\n"
" // -> \"user:\\n id: 1\\n name: Bob\"\n"
"\n"
" // Array\n"
" let value = Array([Number(1.0), Number(2.0), Number(3.0)])\n"
" encode_value(value, default_encode_options())\n"
" // -> \"[3]: 1,2,3\"\n"
" ```\n"
).
-file("src/toon_codec/encode.gleam", 51).
-spec encode_value(
toon_codec@types:json_value(),
toon_codec@types:encode_options()
) -> binary().
encode_value(Value, Options) ->
case Value of
null ->
toon_codec@encode@primitives:encode_primitive(
Value,
erlang:element(3, Options)
);
{bool, _} ->
toon_codec@encode@primitives:encode_primitive(
Value,
erlang:element(3, Options)
);
{number, _} ->
toon_codec@encode@primitives:encode_primitive(
Value,
erlang:element(3, Options)
);
{string, _} ->
toon_codec@encode@primitives:encode_primitive(
Value,
erlang:element(3, Options)
);
{array, Items} ->
W = toon_codec@encode@writer:new(erlang:element(2, Options)),
W@1 = toon_codec@encode@arrays:encode_array(
none,
Items,
W,
0,
Options
),
toon_codec@encode@writer:to_string(W@1);
{object, Fields} ->
case Fields of
[] ->
<<""/utf8>>;
_ ->
W@2 = toon_codec@encode@writer:new(
erlang:element(2, Options)
),
W@3 = toon_codec@encode@objects:encode_object(
Fields,
W@2,
0,
Options
),
toon_codec@encode@writer:to_string(W@3)
end
end.