Current section
Files
Jump to
Current section
Files
src/parsers@toml@printer.erl
-module(parsers@toml@printer).
-compile(no_auto_import).
-export([to_json/1, parse_json/1, print/1]).
-spec with_type_info(binary(), binary()) -> gleam@json:json().
with_type_info(Type_, Value) ->
_pipe@2 = [{<<"type"/utf8>>,
begin
_pipe = Type_,
gleam@json:string(_pipe)
end},
{<<"value"/utf8>>,
begin
_pipe@1 = Value,
gleam@json:string(_pipe@1)
end}],
gleam@json:object(_pipe@2).
-spec table_to_json_object(list({binary(), parsers@toml@model:node_()})) -> gleam@json:json().
table_to_json_object(Tbl) ->
_pipe = Tbl,
_pipe@1 = gleam@list:map(
_pipe,
fun(It) ->
{Key, Node} = It,
{Key, node_to_json(Node)}
end
),
gleam@json:object(_pipe@1).
-spec node_to_json(parsers@toml@model:node_()) -> gleam@json:json().
node_to_json(Node) ->
case Node of
{v_table, It} ->
table_to_json_object(It);
{vt_array, It@1} ->
gleam@json:array(It@1, fun table_to_json_object/1);
{v_string, It@2} ->
with_type_info(<<"string"/utf8>>, It@2);
{v_integer, It@3} ->
with_type_info(
<<"integer"/utf8>>,
begin
_pipe = It@3,
gleam@int:to_string(_pipe)
end
);
{v_float, It@4} ->
with_type_info(<<"float"/utf8>>, case It@4 of
{float_numeric, It@5} ->
_pipe@1 = It@5,
_pipe@2 = gleam@json:float(_pipe@1),
gleam@json:to_string(_pipe@2);
{na_n, _@1} ->
<<"nan"/utf8>>;
{inf, Pos} ->
gleam@string:concat(
[parsers@toml@model:positiveness_to_string(Pos),
<<"inf"/utf8>>]
)
end);
{v_boolean, It@6} ->
with_type_info(
<<"bool"/utf8>>,
begin
_pipe@3 = It@6,
_pipe@4 = gleam@json:bool(_pipe@3),
gleam@json:to_string(_pipe@4)
end
);
{v_datetime, It@7} ->
case It@7 of
{rfc3339_datetime, _@2} ->
with_type_info(
<<"datetime"/utf8>>,
parsers@rfc_3339:print(It@7)
);
{rfc3339_local_datetime, _@3} ->
with_type_info(
<<"datetime-local"/utf8>>,
parsers@rfc_3339:print(It@7)
);
{rfc3339_local_date, _@4} ->
with_type_info(
<<"date-local"/utf8>>,
parsers@rfc_3339:print(It@7)
);
{rfc3339_local_time, _@5} ->
with_type_info(
<<"time-local"/utf8>>,
parsers@rfc_3339:print(It@7)
)
end;
{v_array, It@8} ->
gleam@json:array(It@8, fun node_to_json/1)
end.
-spec to_json(list({binary(), parsers@toml@model:node_()})) -> binary().
to_json(Toml) ->
_pipe = table_to_json_object(Toml),
gleam@json:to_string(_pipe).
-spec parse_json_float(gleam@dynamic:dynamic()) -> {ok,
parsers@toml@model:node_()} |
{error, list(gleam@dynamic:decode_error())}.
parse_json_float(It) ->
_pipe = It,
_pipe@1 = (gleam@dynamic:field(<<"value"/utf8>>, fun gleam@dynamic:string/1))(
_pipe
),
_pipe@7 = gleam@result:then(_pipe@1, fun(St) -> case St of
<<"nan"/utf8>> ->
{ok, {na_n, v_none}};
<<"+nan"/utf8>> ->
{ok, {na_n, v_positive}};
<<"-nan"/utf8>> ->
{ok, {na_n, v_negative}};
<<"inf"/utf8>> ->
{ok, {inf, v_none}};
<<"+inf"/utf8>> ->
{ok, {inf, v_positive}};
<<"-inf"/utf8>> ->
{ok, {inf, v_negative}};
_@1 ->
case gleam@float:parse(St) of
{error, _@2} ->
case gleam@int:parse(St) of
{ok, F} ->
_pipe@2 = F,
_pipe@3 = gleam@int:to_float(_pipe@2),
_pipe@4 = {float_numeric, _pipe@3},
{ok, _pipe@4};
{error, _@3} ->
{error, []}
end;
{ok, F@1} ->
_pipe@5 = F@1,
_pipe@6 = {float_numeric, _pipe@5},
{ok, _pipe@6}
end
end end),
gleam@result:map(_pipe@7, fun(A) -> {v_float, A} end).
-spec table_row_typed_decoder(gleam@dynamic:dynamic()) -> {ok,
parsers@toml@model:node_()} |
{error, list(gleam@dynamic:decode_error())}.
table_row_typed_decoder(It) ->
case begin
_pipe = It,
(gleam@dynamic:field(<<"type"/utf8>>, fun gleam@dynamic:string/1))(
_pipe
)
end of
{error, _try} -> {error, _try};
{ok, Tp} ->
case Tp of
<<"string"/utf8>> ->
_pipe@1 = It,
_pipe@2 = (gleam@dynamic:field(
<<"value"/utf8>>,
fun gleam@dynamic:string/1
))(_pipe@1),
gleam@result:map(_pipe@2, fun(A) -> {v_string, A} end);
<<"integer"/utf8>> ->
_pipe@3 = It,
_pipe@4 = (gleam@dynamic:field(
<<"value"/utf8>>,
fun gleam@dynamic:string/1
))(_pipe@3),
_pipe@6 = gleam@result:then(
_pipe@4,
fun(St) ->
_pipe@5 = gleam@int:parse(St),
gleam@result:map_error(_pipe@5, fun(_) -> [] end)
end
),
gleam@result:map(_pipe@6, fun(A) -> {v_integer, A} end);
<<"float"/utf8>> ->
parse_json_float(It);
<<"bool"/utf8>> ->
_pipe@7 = It,
_pipe@8 = (gleam@dynamic:field(
<<"value"/utf8>>,
fun gleam@dynamic:string/1
))(_pipe@7),
gleam@result:map(_pipe@8, fun(Str) -> case Str of
<<"true"/utf8>> ->
{v_boolean, true};
<<"false"/utf8>> ->
{v_boolean, false}
end end);
<<"time-local"/utf8>> ->
_pipe@9 = It,
_pipe@10 = (gleam@dynamic:field(
<<"value"/utf8>>,
fun gleam@dynamic:string/1
))(_pipe@9),
gleam@result:then(
_pipe@10,
fun(Str@1) -> case parsers@rfc_3339:parse(Str@1) of
{ok, P} ->
{ok, {v_datetime, P}};
{error, _@1} ->
{error,
[{decode_error,
<<"rfc_3339"/utf8>>,
Str@1,
[]}]}
end end
);
<<"date-local"/utf8>> ->
_pipe@9 = It,
_pipe@10 = (gleam@dynamic:field(
<<"value"/utf8>>,
fun gleam@dynamic:string/1
))(_pipe@9),
gleam@result:then(
_pipe@10,
fun(Str@1) -> case parsers@rfc_3339:parse(Str@1) of
{ok, P} ->
{ok, {v_datetime, P}};
{error, _@1} ->
{error,
[{decode_error,
<<"rfc_3339"/utf8>>,
Str@1,
[]}]}
end end
);
<<"datetime-local"/utf8>> ->
_pipe@9 = It,
_pipe@10 = (gleam@dynamic:field(
<<"value"/utf8>>,
fun gleam@dynamic:string/1
))(_pipe@9),
gleam@result:then(
_pipe@10,
fun(Str@1) -> case parsers@rfc_3339:parse(Str@1) of
{ok, P} ->
{ok, {v_datetime, P}};
{error, _@1} ->
{error,
[{decode_error,
<<"rfc_3339"/utf8>>,
Str@1,
[]}]}
end end
);
<<"datetime"/utf8>> ->
_pipe@9 = It,
_pipe@10 = (gleam@dynamic:field(
<<"value"/utf8>>,
fun gleam@dynamic:string/1
))(_pipe@9),
gleam@result:then(
_pipe@10,
fun(Str@1) -> case parsers@rfc_3339:parse(Str@1) of
{ok, P} ->
{ok, {v_datetime, P}};
{error, _@1} ->
{error,
[{decode_error,
<<"rfc_3339"/utf8>>,
Str@1,
[]}]}
end end
)
end
end.
-spec table_row_decoder_inside_array(gleam@dynamic:dynamic()) -> {ok,
parsers@toml@model:node_()} |
{error, list(gleam@dynamic:decode_error())}.
table_row_decoder_inside_array(It) ->
_pipe = table_row_typed_decoder(It),
_pipe@3 = gleam@result:lazy_or(
_pipe,
fun() ->
_pipe@1 = It,
_pipe@2 = (gleam@dynamic:list(fun table_row_decoder_inside_array/1))(
_pipe@1
),
gleam@result:map(_pipe@2, fun(A) -> {v_array, A} end)
end
),
gleam@result:lazy_or(
_pipe@3,
fun() ->
_pipe@4 = json_toml_doc_decoder_inside_array(It),
gleam@result:map(_pipe@4, fun(A) -> {v_table, A} end)
end
).
-spec json_toml_doc_decoder_inside_array(gleam@dynamic:dynamic()) -> {ok,
list({binary(),
parsers@toml@model:node_()})} |
{error, list(gleam@dynamic:decode_error())}.
json_toml_doc_decoder_inside_array(It) ->
_pipe = It,
_pipe@1 = (gleam@dynamic:map(
fun gleam@dynamic:string/1,
fun table_row_decoder_inside_array/1
))(_pipe),
gleam@result:map(_pipe@1, fun gleam@map:to_list/1).
-spec table_row_decoder(gleam@dynamic:dynamic()) -> {ok,
parsers@toml@model:node_()} |
{error, list(gleam@dynamic:decode_error())}.
table_row_decoder(It) ->
_pipe = table_row_typed_decoder(It),
_pipe@3 = gleam@result:lazy_or(
_pipe,
fun() ->
_pipe@1 = It,
_pipe@2 = (gleam@dynamic:list(fun json_toml_doc_decoder/1))(_pipe@1),
gleam@result:map(_pipe@2, fun(A) -> {vt_array, A} end)
end
),
_pipe@6 = gleam@result:lazy_or(
_pipe@3,
fun() ->
_pipe@4 = It,
_pipe@5 = (gleam@dynamic:list(fun table_row_decoder_inside_array/1))(
_pipe@4
),
gleam@result:map(_pipe@5, fun(A) -> {v_array, A} end)
end
),
gleam@result:lazy_or(
_pipe@6,
fun() ->
_pipe@7 = json_toml_doc_decoder(It),
gleam@result:map(_pipe@7, fun(A) -> {v_table, A} end)
end
).
-spec json_toml_doc_decoder(gleam@dynamic:dynamic()) -> {ok,
list({binary(),
parsers@toml@model:node_()})} |
{error, list(gleam@dynamic:decode_error())}.
json_toml_doc_decoder(It) ->
_pipe = It,
_pipe@1 = (gleam@dynamic:map(
fun gleam@dynamic:string/1,
fun table_row_decoder/1
))(_pipe),
gleam@result:map(_pipe@1, fun gleam@map:to_list/1).
-spec parse_json(binary()) -> list({binary(), parsers@toml@model:node_()}).
parse_json(It) ->
{ok, It@2} = case gleam@json:decode(It, fun json_toml_doc_decoder/1) of
{ok, It@1} -> {ok, It@1};
_try ->
erlang:error(#{gleam_error => assert,
message => <<"Assertion pattern match failed"/utf8>>,
value => _try,
module => <<"parsers/toml/printer"/utf8>>,
function => <<"parse_json"/utf8>>,
line => 221})
end,
It@2.
-spec escape_string(binary()) -> gleam@string_builder:string_builder().
escape_string(It) ->
_pipe = It,
_pipe@1 = gleam@json:string(_pipe),
_pipe@2 = gleam@json:to_string(_pipe@1),
gleam@string_builder:from_string(_pipe@2).
-spec add_assignment(
gleam@string_builder:string_builder(),
gleam@option:option(binary()),
boolean()
) -> gleam@string_builder:string_builder().
add_assignment(To, K, Break_after_assign) ->
Break = case Break_after_assign of
true ->
gleam@string_builder:from_string(<<"\n"/utf8>>);
false ->
gleam@string_builder:from_string(<<""/utf8>>)
end,
case K of
{some, K@1} ->
_pipe = [escape_string(K@1),
gleam@string_builder:from_string(<<" = "/utf8>>),
To,
Break],
gleam@string_builder:concat(_pipe);
none ->
To
end.
-spec print_table_node(
binary(),
list({binary(), parsers@toml@model:node_()}),
list(binary())
) -> gleam@string_builder:string_builder().
print_table_node(K, Table, Table_parents) ->
Parents = gleam@list:append(Table_parents, [K]),
_pipe@4 = [gleam@string_builder:from_string(<<"["/utf8>>),
gleam@string_builder:from_string(
begin
_pipe = Parents,
_pipe@3 = gleam@list:map(
_pipe,
fun(K@1) ->
_pipe@1 = K@1,
_pipe@2 = gleam@json:string(_pipe@1),
gleam@json:to_string(_pipe@2)
end
),
gleam@string:join(_pipe@3, <<"."/utf8>>)
end
),
gleam@string_builder:from_string(<<"]"/utf8>>),
gleam@string_builder:from_string(<<"\n"/utf8>>),
print_table_contents(Table, Parents)],
gleam@string_builder:concat(_pipe@4).
-spec print_inline_table_node(list({binary(), parsers@toml@model:node_()})) -> gleam@string_builder:string_builder().
print_inline_table_node(Table) ->
_pipe@3 = [gleam@string_builder:from_string(<<"{ "/utf8>>),
gleam@string_builder:from_string(
begin
_pipe = Table,
_pipe@2 = gleam@list:map(
_pipe,
fun(Row) ->
{K, Node} = Row,
_pipe@1 = print_node({some, K}, Node, [], false),
gleam@string_builder:to_string(_pipe@1)
end
),
gleam@string:join(_pipe@2, <<", "/utf8>>)
end
),
gleam@string_builder:from_string(<<"} "/utf8>>)],
gleam@string_builder:concat(_pipe@3).
-spec print_table_array_node(
binary(),
list(list({binary(), parsers@toml@model:node_()})),
list(binary())
) -> gleam@string_builder:string_builder().
print_table_array_node(K, Table_list, Table_parents) ->
Parents = gleam@list:append(Table_parents, [K]),
_pipe = Table_list,
_pipe@5 = gleam@list:map(
_pipe,
fun(Table) ->
[gleam@string_builder:from_string(<<"[["/utf8>>),
gleam@string_builder:from_string(
begin
_pipe@1 = Parents,
_pipe@4 = gleam@list:map(
_pipe@1,
fun(K@1) ->
_pipe@2 = K@1,
_pipe@3 = gleam@json:string(_pipe@2),
gleam@json:to_string(_pipe@3)
end
),
gleam@string:join(_pipe@4, <<"."/utf8>>)
end
),
gleam@string_builder:from_string(<<"]]"/utf8>>),
gleam@string_builder:from_string(<<"\n"/utf8>>),
print_table_contents(Table, Parents)]
end
),
_pipe@6 = gleam@list:flatten(_pipe@5),
gleam@string_builder:concat(_pipe@6).
-spec print_node(
gleam@option:option(binary()),
parsers@toml@model:node_(),
list(binary()),
boolean()
) -> gleam@string_builder:string_builder().
print_node(K, It, Table_parents, Break_after_assign) ->
case It of
{v_table, Table} ->
case K of
{some, K@1} ->
print_table_node(K@1, Table, Table_parents);
none ->
print_inline_table_node(Table)
end;
{vt_array, Vta} ->
case K of
{some, K@2} ->
print_table_array_node(K@2, Vta, Table_parents);
none ->
erlang:error(#{gleam_error => todo,
message => <<"This has not yet been implemented"/utf8>>,
module => <<"parsers/toml/printer"/utf8>>,
function => <<"print_node"/utf8>>,
line => 340})
end;
{v_string, S} ->
_pipe = escape_string(S),
add_assignment(_pipe, K, Break_after_assign);
{v_integer, I} ->
_pipe@1 = I,
_pipe@2 = gleam@int:to_string(_pipe@1),
_pipe@3 = gleam@string_builder:from_string(_pipe@2),
add_assignment(_pipe@3, K, Break_after_assign);
{v_float, F} ->
_pipe@8 = case F of
{float_numeric, F@1} ->
_pipe@4 = F@1,
_pipe@5 = gleam@float:to_string(_pipe@4),
gleam@string_builder:from_string(_pipe@5);
{na_n, S@1} ->
_pipe@6 = [gleam@string_builder:from_string(
parsers@toml@model:positiveness_to_string(
S@1
)
),
gleam@string_builder:from_string(<<"nan"/utf8>>)],
gleam@string_builder:concat(_pipe@6);
{inf, S@2} ->
_pipe@7 = [gleam@string_builder:from_string(
parsers@toml@model:positiveness_to_string(
S@2
)
),
gleam@string_builder:from_string(<<"inf"/utf8>>)],
gleam@string_builder:concat(_pipe@7)
end,
add_assignment(_pipe@8, K, Break_after_assign);
{v_boolean, B} ->
_pipe@9 = case B of
true ->
gleam@string_builder:from_string(<<"true"/utf8>>);
false ->
gleam@string_builder:from_string(<<"false"/utf8>>)
end,
add_assignment(_pipe@9, K, Break_after_assign);
{v_datetime, D} ->
_pipe@10 = parsers@rfc_3339:print(D),
_pipe@11 = gleam@string_builder:from_string(_pipe@10),
add_assignment(_pipe@11, K, Break_after_assign);
{v_array, Ns} ->
_pipe@15 = [gleam@string_builder:from_string(<<"["/utf8>>),
gleam@string_builder:from_string(
begin
_pipe@12 = Ns,
_pipe@14 = gleam@list:map(
_pipe@12,
fun(Node) ->
_pipe@13 = print_node(
none,
Node,
[],
false
),
gleam@string_builder:to_string(_pipe@13)
end
),
gleam@string:join(_pipe@14, <<", "/utf8>>)
end
),
gleam@string_builder:from_string(<<"]"/utf8>>)],
_pipe@16 = gleam@string_builder:concat(_pipe@15),
add_assignment(_pipe@16, K, Break_after_assign)
end.
-spec print_table_contents(
list({binary(), parsers@toml@model:node_()}),
list(binary())
) -> gleam@string_builder:string_builder().
print_table_contents(It, Table_parents) ->
_pipe = It,
_pipe@1 = gleam@list:sort(
_pipe,
fun(A, B) ->
{_@1, A@1} = A,
{_@2, B@1} = B,
case A@1 of
{v_table, _@3} ->
case B@1 of
{v_table, _@4} ->
eq;
{vt_array, _@4} ->
eq;
_@5 ->
gt
end;
{vt_array, _@3} ->
case B@1 of
{v_table, _@4} ->
eq;
{vt_array, _@4} ->
eq;
_@5 ->
gt
end;
_@6 ->
case B@1 of
{v_table, _@7} ->
lt;
{vt_array, _@7} ->
lt;
_@8 ->
eq
end
end
end
),
_pipe@3 = gleam@list:map(
_pipe@1,
fun(Row) ->
{K, V} = Row,
_pipe@2 = [print_node({some, K}, V, Table_parents, true)],
gleam@string_builder:concat(_pipe@2)
end
),
gleam@string_builder:concat(_pipe@3).
-spec print(list({binary(), parsers@toml@model:node_()})) -> binary().
print(It) ->
_pipe = It,
_pipe@1 = print_table_contents(_pipe, []),
gleam@string_builder:to_string(_pipe@1).