Packages

KDL v2 parser, serializer, normalizer, and document builder for Gleam

Current section

Files

Jump to
kdleam src kdleam@serialize.erl
Raw

src/kdleam@serialize.erl

-module(kdleam@serialize).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/kdleam/serialize.gleam").
-export([write_quoted_string/1, write_value/1, can_be_bare_identifier/1, write_identifier_or_string/1, serialize/1]).
-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(false).
-file("src/kdleam/serialize.gleam", 85).
?DOC(false).
-spec escape_char(binary()) -> binary().
escape_char(Ch) ->
case Ch of
<<"\""/utf8>> ->
<<"\\\""/utf8>>;
<<"\\"/utf8>> ->
<<"\\\\"/utf8>>;
<<"\n"/utf8>> ->
<<"\\n"/utf8>>;
<<"\r"/utf8>> ->
<<"\\r"/utf8>>;
<<"\t"/utf8>> ->
<<"\\t"/utf8>>;
<<"\x{0008}"/utf8>> ->
<<"\\b"/utf8>>;
<<"\x{000C}"/utf8>> ->
<<"\\f"/utf8>>;
C ->
case kdleam@scanner:is_newline(C) orelse kdleam@scanner:is_disallowed(
C
) of
true ->
<<<<"\\u{"/utf8,
((kdleam@scanner:to_upper_hex(
kdleam@scanner:codepoint(C)
)))/binary>>/binary,
"}"/utf8>>;
false ->
C
end
end.
-file("src/kdleam/serialize.gleam", 77).
?DOC(false).
-spec write_quoted_string(binary()) -> binary().
write_quoted_string(Value) ->
<<<<"\""/utf8,
(begin
_pipe = Value,
_pipe@1 = gleam@string:to_graphemes(_pipe),
_pipe@2 = gleam@list:map(_pipe@1, fun escape_char/1),
gleam@string:join(_pipe@2, <<""/utf8>>)
end)/binary>>/binary,
"\""/utf8>>.
-file("src/kdleam/serialize.gleam", 58).
?DOC(false).
-spec write_value(kdleam@document:kdl_value()) -> binary().
write_value(Value) ->
case Value of
{kdl_string, Value@1} ->
write_quoted_string(Value@1);
{kdl_number_value, Number} ->
kdleam@document:number_raw(Number);
{kdl_bool, true} ->
<<"#true"/utf8>>;
{kdl_bool, false} ->
<<"#false"/utf8>>;
kdl_null ->
<<"#null"/utf8>>
end.
-file("src/kdleam/serialize.gleam", 103).
?DOC(false).
-spec can_be_bare_identifier(binary()) -> boolean().
can_be_bare_identifier(Value) ->
kdleam@scanner:can_be_bare(Value).
-file("src/kdleam/serialize.gleam", 69).
?DOC(false).
-spec write_identifier_or_string(binary()) -> binary().
write_identifier_or_string(Value) ->
case can_be_bare_identifier(Value) of
true ->
Value;
false ->
write_quoted_string(Value)
end.
-file("src/kdleam/serialize.gleam", 50).
?DOC(false).
-spec write_type(gleam@option:option(binary())) -> binary().
write_type(Ty) ->
case Ty of
{some, Ty@1} ->
<<<<"("/utf8, (write_identifier_or_string(Ty@1))/binary>>/binary,
")"/utf8>>;
none ->
<<""/utf8>>
end.
-file("src/kdleam/serialize.gleam", 38).
?DOC(false).
-spec write_entry(kdleam@document:kdl_entry()) -> binary().
write_entry(Entry) ->
case Entry of
{kdl_argument, Ty, Value} ->
<<(write_type(Ty))/binary, (write_value(Value))/binary>>;
{kdl_property, Key, Ty@1, Value@1} ->
<<<<<<(write_identifier_or_string(Key))/binary, "="/utf8>>/binary,
(write_type(Ty@1))/binary>>/binary,
(write_value(Value@1))/binary>>
end.
-file("src/kdleam/serialize.gleam", 15).
?DOC(false).
-spec write_node(kdleam@document:kdl_node(), integer()) -> binary().
write_node(Node, Depth) ->
{kdl_node, Ty, Name, Entries, Children} = Node,
Head = <<<<(kdleam@scanner:repeat(<<" "/utf8>>, Depth))/binary,
(write_type(Ty))/binary>>/binary,
(write_identifier_or_string(Name))/binary>>,
Entry_text = begin
_pipe = Entries,
_pipe@1 = gleam@list:map(
_pipe,
fun(Entry) -> <<" "/utf8, (write_entry(Entry))/binary>> end
),
gleam@string:join(_pipe@1, <<""/utf8>>)
end,
case Children of
{some, Kids} ->
<<<<<<<<<<Head/binary, Entry_text/binary>>/binary, " {\n"/utf8>>/binary,
(begin
_pipe@2 = Kids,
_pipe@3 = gleam@list:map(
_pipe@2,
fun(_capture) ->
write_node(_capture, Depth + 1)
end
),
gleam@string:join(_pipe@3, <<""/utf8>>)
end)/binary>>/binary,
(kdleam@scanner:repeat(<<" "/utf8>>, Depth))/binary>>/binary,
"}\n"/utf8>>;
_ ->
<<<<Head/binary, Entry_text/binary>>/binary, "\n"/utf8>>
end.
-file("src/kdleam/serialize.gleam", 10).
?DOC(false).
-spec serialize(kdleam@document:kdl_document()) -> binary().
serialize(Doc) ->
{kdl_document, Nodes} = Doc,
_pipe = Nodes,
_pipe@1 = gleam@list:map(
_pipe,
fun(_capture) -> write_node(_capture, 0) end
),
gleam@string:join(_pipe@1, <<""/utf8>>).