Current section
Files
Jump to
Current section
Files
src/metamon@internal@regression.erl
-module(metamon@internal@regression).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/metamon/internal/regression.gleam").
-export([parse/1, render/1]).
-export_type([entry/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(false).
-type entry() :: {entry,
binary(),
integer(),
integer(),
integer(),
gleam@option:option(integer()),
gleam@option:option(binary()),
binary()}.
-file("src/metamon/internal/regression.gleam", 130).
?DOC(false).
-spec parse_pair(binary()) -> {ok, {binary(), binary()}} | {error, nil}.
parse_pair(Line) ->
case gleam@string:split_once(Line, <<"="/utf8>>) of
{ok, {Left, Right}} ->
{ok, {gleam@string:trim(Left), gleam@string:trim(Right)}};
{error, _} ->
{error, nil}
end.
-file("src/metamon/internal/regression.gleam", 125).
?DOC(false).
-spec parse_lines(binary()) -> list({binary(), binary()}).
parse_lines(Block) ->
_pipe = gleam@string:split(Block, <<"\n"/utf8>>),
gleam@list:filter_map(_pipe, fun parse_pair/1).
-file("src/metamon/internal/regression.gleam", 137).
?DOC(false).
-spec lookup(list({binary(), binary()}), binary()) -> {ok, binary()} |
{error, nil}.
lookup(Pairs, Key) ->
case Pairs of
[] ->
{error, nil};
[{K, V} | Rest] ->
case K =:= Key of
true ->
{ok, V};
false ->
lookup(Rest, Key)
end
end.
-file("src/metamon/internal/regression.gleam", 148).
?DOC(false).
-spec parse_edge(binary()) -> {ok, gleam@option:option(integer())} |
{error, nil}.
parse_edge(Value) ->
case Value of
<<"none"/utf8>> ->
{ok, none};
Raw ->
case gleam_stdlib:parse_int(Raw) of
{ok, N} ->
{ok, {some, N}};
{error, _} ->
{error, nil}
end
end.
-file("src/metamon/internal/regression.gleam", 159).
?DOC(false).
-spec strip_quotes(binary()) -> binary().
strip_quotes(Value) ->
case {gleam_stdlib:string_starts_with(Value, <<"\""/utf8>>),
gleam_stdlib:string_ends_with(Value, <<"\""/utf8>>)} of
{true, true} ->
_pipe = Value,
_pipe@1 = gleam@string:drop_start(_pipe, 1),
gleam@string:drop_end(_pipe@1, 1);
{_, _} ->
Value
end.
-file("src/metamon/internal/regression.gleam", 118).
?DOC(false).
-spec lookup_note(list({binary(), binary()})) -> gleam@option:option(binary()).
lookup_note(Pairs) ->
case lookup(Pairs, <<"note"/utf8>>) of
{ok, Text} ->
{some, strip_quotes(Text)};
{error, _} ->
none
end.
-file("src/metamon/internal/regression.gleam", 89).
?DOC(false).
-spec build_entry(
list({binary(), binary()}),
binary(),
binary(),
binary(),
binary(),
binary(),
binary()
) -> {ok, entry()} | {error, nil}.
build_entry(Pairs, Mr, Seed_str, Run_str, Size_str, Edge_str, Rec) ->
case {gleam_stdlib:parse_int(Seed_str),
gleam_stdlib:parse_int(Run_str),
gleam_stdlib:parse_int(Size_str),
parse_edge(Edge_str)} of
{{ok, Seed_value}, {ok, Run_value}, {ok, Size_value}, {ok, Edge}} ->
{ok,
{entry,
strip_quotes(Mr),
Seed_value,
Run_value,
Size_value,
Edge,
lookup_note(Pairs),
strip_quotes(Rec)}};
{_, _, _, _} ->
{error, nil}
end.
-file("src/metamon/internal/regression.gleam", 74).
?DOC(false).
-spec parse_block_body(list({binary(), binary()})) -> {ok, entry()} |
{error, nil}.
parse_block_body(Pairs) ->
case {lookup(Pairs, <<"mr"/utf8>>),
lookup(Pairs, <<"config_seed"/utf8>>),
lookup(Pairs, <<"run_index"/utf8>>),
lookup(Pairs, <<"size"/utf8>>),
lookup(Pairs, <<"edge_index"/utf8>>),
lookup(Pairs, <<"recorded"/utf8>>)} of
{{ok, Mr},
{ok, Seed_str},
{ok, Run_str},
{ok, Size_str},
{ok, Edge_str},
{ok, Rec}} ->
build_entry(Pairs, Mr, Seed_str, Run_str, Size_str, Edge_str, Rec);
{_, _, _, _, _, _} ->
{error, nil}
end.
-file("src/metamon/internal/regression.gleam", 67).
?DOC(false).
-spec parse_block(binary()) -> {ok, entry()} | {error, nil}.
parse_block(Raw) ->
case gleam@string:trim(Raw) of
<<""/utf8>> ->
{error, nil};
Trimmed ->
parse_block_body(parse_lines(Trimmed))
end.
-file("src/metamon/internal/regression.gleam", 62).
?DOC(false).
-spec parse(binary()) -> list(entry()).
parse(Contents) ->
_pipe = gleam@string:split(Contents, <<"[[failures]]"/utf8>>),
gleam@list:filter_map(_pipe, fun parse_block/1).
-file("src/metamon/internal/regression.gleam", 169).
?DOC(false).
-spec escape_string(binary()) -> binary().
escape_string(Value) ->
<<<<"\""/utf8,
(gleam@string:replace(Value, <<"\""/utf8>>, <<"\\\""/utf8>>))/binary>>/binary,
"\""/utf8>>.
-file("src/metamon/internal/regression.gleam", 28).
?DOC(false).
-spec render(entry()) -> binary().
render(Entry) ->
Edge_part = case erlang:element(6, Entry) of
none ->
<<"edge_index = none"/utf8>>;
{some, I} ->
<<"edge_index = "/utf8, (erlang:integer_to_binary(I))/binary>>
end,
Note_part = case erlang:element(7, Entry) of
none ->
<<""/utf8>>;
{some, Text} ->
<<"\nnote = "/utf8, (escape_string(Text))/binary>>
end,
erlang:list_to_binary(
[<<"[[failures]]\n"/utf8>>,
<<"mr = "/utf8>>,
escape_string(erlang:element(2, Entry)),
<<"\n"/utf8>>,
<<"config_seed = "/utf8>>,
erlang:integer_to_binary(erlang:element(3, Entry)),
<<"\n"/utf8>>,
<<"run_index = "/utf8>>,
erlang:integer_to_binary(erlang:element(4, Entry)),
<<"\n"/utf8>>,
<<"size = "/utf8>>,
erlang:integer_to_binary(erlang:element(5, Entry)),
<<"\n"/utf8>>,
Edge_part,
Note_part,
<<"\nrecorded = "/utf8>>,
escape_string(erlang:element(8, Entry)),
<<"\n"/utf8>>]
).