Packages
caffeine_lang
4.6.2
6.3.1
6.3.0
6.2.2
6.2.1
6.2.0
6.1.2
6.1.1
6.1.0
6.0.0
5.6.0
5.5.0
5.4.4
5.4.3
5.4.2
5.4.1
5.4.0
5.3.0
5.2.0
5.1.1
5.1.0
5.0.12
5.0.11
5.0.10
5.0.8
5.0.7
5.0.6
5.0.5
5.0.4
5.0.1
5.0.0
4.10.0
4.9.0
4.8.3
4.8.2
4.8.1
4.8.0
4.7.9
4.7.8
4.7.7
4.7.6
4.7.5
4.6.7
4.6.6
4.6.5
4.6.4
4.6.3
4.6.2
4.6.0
4.5.1
4.5.0
4.4.4
4.4.3
4.4.1
4.4.0
4.3.7
4.3.6
3.0.6
3.0.5
3.0.4
3.0.3
3.0.2
3.0.1
3.0.0
2.0.5
2.0.4
2.0.3
2.0.2
2.0.1
2.0.0
1.0.2
1.0.1
0.1.0
0.0.24
0.0.23
0.0.22
0.0.21
0.0.20
0.0.19
0.0.18
0.0.17
0.0.16
0.0.15
0.0.14
0.0.13
0.0.12
0.0.11
0.0.10
0.0.9
0.0.8
0.0.7
0.0.6
0.0.5
0.0.4
0.0.2
0.0.1
A compiler for generating reliability artifacts from service expectation definitions.
Current section
Files
Jump to
Current section
Files
src/caffeine_lang@parsing_utils.erl
-module(caffeine_lang@parsing_utils).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/caffeine_lang/parsing_utils.gleam").
-export([extract_paren_content/1, paren_innerds_trimmed/1, split_at_top_level_comma/1, paren_innerds_split_and_trimmed/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.
-file("src/caffeine_lang/parsing_utils.gleam", 39).
?DOC(
" Finds the matching closing parenthesis, tracking nesting depth.\n"
" Returns the content before the matching close and the rest after it.\n"
).
-spec find_matching_close_paren(binary(), integer(), binary()) -> {ok,
{binary(), binary()}} |
{error, nil}.
find_matching_close_paren(S, Depth, Acc) ->
case gleam_stdlib:string_pop_grapheme(S) of
{error, _} ->
{error, nil};
{ok, {<<"("/utf8>>, Rest}} ->
find_matching_close_paren(Rest, Depth + 1, <<Acc/binary, "("/utf8>>);
{ok, {<<")"/utf8>>, Rest@1}} ->
case Depth of
1 ->
{ok, {Acc, Rest@1}};
_ ->
find_matching_close_paren(
Rest@1,
Depth - 1,
<<Acc/binary, ")"/utf8>>
)
end;
{ok, {Char, Rest@2}} ->
find_matching_close_paren(
Rest@2,
Depth,
<<Acc/binary, Char/binary>>
)
end.
-file("src/caffeine_lang/parsing_utils.gleam", 17).
?DOC(false).
-spec extract_paren_content(binary()) -> {ok, binary()} | {error, nil}.
extract_paren_content(Raw) ->
case gleam@string:split_once(Raw, <<"("/utf8>>) of
{error, _} ->
{error, nil};
{ok, {_, After_open}} ->
gleam@result:'try'(
find_matching_close_paren(After_open, 1, <<""/utf8>>),
fun(_use0) ->
{Content, Rest} = _use0,
case gleam@string:trim(Rest) of
<<""/utf8>> ->
{ok, gleam@string:trim(Content)};
_ ->
{error, nil}
end
end
)
end.
-file("src/caffeine_lang/parsing_utils.gleam", 60).
?DOC(false).
-spec paren_innerds_trimmed(binary()) -> binary().
paren_innerds_trimmed(Raw) ->
case extract_paren_content(Raw) of
{ok, Content} ->
Content;
{error, _} ->
gleam@string:trim(Raw)
end.
-file("src/caffeine_lang/parsing_utils.gleam", 78).
-spec do_split_at_top_level_comma(
list(binary()),
integer(),
integer(),
binary(),
list(binary())
) -> list(binary()).
do_split_at_top_level_comma(Chars, Paren_depth, Brace_depth, Current, Acc) ->
case Chars of
[] ->
Trimmed = gleam@string:trim(Current),
case Trimmed of
<<""/utf8>> ->
lists:reverse(Acc);
_ ->
lists:reverse([Trimmed | Acc])
end;
[<<"("/utf8>> | Rest] ->
do_split_at_top_level_comma(
Rest,
Paren_depth + 1,
Brace_depth,
<<Current/binary, "("/utf8>>,
Acc
);
[<<")"/utf8>> | Rest@1] ->
do_split_at_top_level_comma(
Rest@1,
Paren_depth - 1,
Brace_depth,
<<Current/binary, ")"/utf8>>,
Acc
);
[<<"{"/utf8>> | Rest@2] ->
do_split_at_top_level_comma(
Rest@2,
Paren_depth,
Brace_depth + 1,
<<Current/binary, "{"/utf8>>,
Acc
);
[<<"}"/utf8>> | Rest@3] ->
do_split_at_top_level_comma(
Rest@3,
Paren_depth,
Brace_depth - 1,
<<Current/binary, "}"/utf8>>,
Acc
);
[<<","/utf8>> | Rest@4] when (Paren_depth =:= 0) andalso (Brace_depth =:= 0) ->
Trimmed@1 = gleam@string:trim(Current),
do_split_at_top_level_comma(
Rest@4,
Paren_depth,
Brace_depth,
<<""/utf8>>,
[Trimmed@1 | Acc]
);
[Char | Rest@5] ->
do_split_at_top_level_comma(
Rest@5,
Paren_depth,
Brace_depth,
<<Current/binary, Char/binary>>,
Acc
)
end.
-file("src/caffeine_lang/parsing_utils.gleam", 8).
?DOC(false).
-spec split_at_top_level_comma(binary()) -> list(binary()).
split_at_top_level_comma(S) ->
Chars = gleam@string:to_graphemes(S),
do_split_at_top_level_comma(Chars, 0, 0, <<""/utf8>>, []).
-file("src/caffeine_lang/parsing_utils.gleam", 71).
?DOC(false).
-spec paren_innerds_split_and_trimmed(binary()) -> list(binary()).
paren_innerds_split_and_trimmed(Raw) ->
case extract_paren_content(Raw) of
{ok, Content} ->
split_at_top_level_comma(Content);
{error, _} ->
[]
end.