Packages
caffeine_lang
4.3.7
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@position_utils.erl
-module(caffeine_lang@position_utils).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/caffeine_lang/position_utils.gleam").
-export([find_name_position/2]).
-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/position_utils.gleam", 54).
-spec is_word_char(binary()) -> boolean().
is_word_char(G) ->
case G of
<<"_"/utf8>> ->
true;
_ ->
case gleam@string:to_utf_codepoints(G) of
[Cp] ->
Code = gleam_stdlib:identity(Cp),
(((Code >= 65) andalso (Code =< 90)) orelse ((Code >= 97)
andalso (Code =< 122)))
orelse ((Code >= 48) andalso (Code =< 57));
_ ->
false
end
end.
-file("src/caffeine_lang/position_utils.gleam", 30).
?DOC(
" Searches for `name` as a whole word within `line`, starting from `offset`.\n"
" Returns Ok(column) as 0-indexed offset on match, Error(Nil) if not found.\n"
).
-spec find_whole_word(binary(), binary(), integer()) -> {ok, integer()} |
{error, nil}.
find_whole_word(Line, Name, Offset) ->
case gleam@string:split_once(Line, Name) of
{error, _} ->
{error, nil};
{ok, {Before, After}} ->
Col = Offset + string:length(Before),
Before_ok = case gleam@string:last(Before) of
{ok, C} ->
not is_word_char(C);
{error, _} ->
true
end,
After_ok = case gleam@string:first(After) of
{ok, C@1} ->
not is_word_char(C@1);
{error, _} ->
true
end,
case Before_ok andalso After_ok of
true ->
{ok, Col};
false ->
Skip = string:length(Before) + string:length(Name),
find_whole_word(
gleam@string:drop_start(Line, Skip),
Name,
Offset + Skip
)
end
end.
-file("src/caffeine_lang/position_utils.gleam", 12).
-spec find_in_lines(list(binary()), binary(), integer()) -> {integer(),
integer()}.
find_in_lines(Lines, Name, Line_num) ->
case Lines of
[] ->
{1, 1};
[First | Rest] ->
case find_whole_word(First, Name, 0) of
{ok, Col} ->
{Line_num, Col + 1};
{error, _} ->
find_in_lines(Rest, Name, Line_num + 1)
end
end.
-file("src/caffeine_lang/position_utils.gleam", 7).
?DOC(
" Finds the 1-indexed line and column of the first whole-word occurrence\n"
" of a name in source. Returns #(1, 1) if not found.\n"
).
-spec find_name_position(binary(), binary()) -> {integer(), integer()}.
find_name_position(Content, Name) ->
Lines = gleam@string:split(Content, <<"\n"/utf8>>),
find_in_lines(Lines, Name, 1).