Current section

Files

Jump to
novdom_dev_tools src lustre_dev_tools@utils.erl
Raw

src/lustre_dev_tools@utils.erl

-module(lustre_dev_tools@utils).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([term_width/0, shorten_url/2]).
-export_type(['end'/0]).
-type 'end'() :: left | right.
-spec term_width() -> integer().
term_width() ->
_pipe = term_size:columns(),
gleam@result:unwrap(_pipe, 80).
-spec do_shorten(
list(binary()),
list(binary()),
boolean(),
'end'(),
integer(),
integer()
) -> {ok, {list(binary()), list(binary())}} | {error, nil}.
do_shorten(Left, Right, Shortened, From, Current_length, Max_length) ->
case {Current_length =< Max_length, Left, Right, From} of
{true, _, _, _} ->
case Shortened of
true ->
{ok, {Left, Right}};
false ->
{error, nil}
end;
{_, [], [_], _} ->
case Shortened of
true ->
{ok, {Left, Right}};
false ->
{error, nil}
end;
{_, [], [], _} ->
case Shortened of
true ->
{ok, {Left, Right}};
false ->
{error, nil}
end;
{_, Left@1, [_] = Right@1, right} ->
do_shorten(
Left@1,
Right@1,
Shortened,
left,
Current_length,
Max_length
);
{_, [Dropped | Left@2], Right@2, left} ->
New_length = Current_length - gleam@string:length(Dropped),
do_shorten(Left@2, Right@2, true, right, New_length, Max_length);
{_, Left@3, [Dropped@1 | Right@3], right} ->
New_length@1 = Current_length - gleam@string:length(Dropped@1),
do_shorten(Left@3, Right@3, true, left, New_length@1, Max_length);
{_, [], Right@4, left} ->
do_shorten(
[],
Right@4,
Shortened,
right,
Current_length,
Max_length
);
{_, Left@4, [], right} ->
do_shorten(Left@4, [], Shortened, left, Current_length, Max_length)
end.
-spec shorten(list(binary()), integer()) -> {ok,
{list(binary()), list(binary())}} |
{error, nil}.
shorten(Strings, Max_length) ->
Initial_length = gleam@list:fold(
Strings,
0,
fun(Acc, String) -> Acc + gleam@string:length(String) end
),
Middle = erlang:length(Strings) div 2,
{Left, Right} = gleam@list:split(Strings, Middle),
Left@1 = lists:reverse(Left),
case do_shorten(Left@1, Right, false, right, Initial_length, Max_length) of
{ok, {New_left, New_right}} ->
{ok, {lists:reverse(New_left), New_right}};
{error, nil} ->
{error, nil}
end.
-spec shorten_url(binary(), integer()) -> binary().
shorten_url(Url, Max_length) ->
Chunks = case Url of
<<"https://"/utf8, Rest/binary>> ->
[<<"https:/"/utf8>> | gleam@string:split(Rest, <<"/"/utf8>>)];
_ ->
gleam@string:split(Url, <<"/"/utf8>>)
end,
Max_length@1 = Max_length - erlang:length(Chunks),
case shorten(Chunks, Max_length@1) of
{error, _} ->
Url;
{ok, {Left, Right}} ->
<<<<(gleam@string:join(Left, <<"/"/utf8>>))/binary, "/.../"/utf8>>/binary,
(gleam@string:join(Right, <<"/"/utf8>>))/binary>>
end.