Current section
Files
Jump to
Current section
Files
src/taffy@parser@helpers.erl
-module(taffy@parser@helpers).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/taffy/parser/helpers.gleam").
-export([current/1, advance/1, backtrack/1, skip_whitespace/1, flow_whitespace_has_comment/1, skip_flow_whitespace/1, skip_newlines_and_comments/1, skip_newlines_and_comments_tracking/1, is_terminator/1, token_to_string/1, token_for_error/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.
?MODULEDOC(false).
-file("src/taffy/parser/helpers.gleam", 8).
?DOC(false).
-spec current(taffy@parser@types:parser()) -> gleam@option:option(taffy@lexer:token()).
current(Parser) ->
case erlang:element(2, Parser) of
[First | _] ->
{some, First};
[] ->
none
end.
-file("src/taffy/parser/helpers.gleam", 15).
?DOC(false).
-spec advance(taffy@parser@types:parser()) -> taffy@parser@types:parser().
advance(Parser) ->
case erlang:element(2, Parser) of
[First | Rest] ->
{parser,
Rest,
[First | erlang:element(3, Parser)],
erlang:element(4, Parser) + 1,
erlang:element(5, Parser),
erlang:element(6, Parser),
erlang:element(7, Parser),
erlang:element(8, Parser),
erlang:element(9, Parser),
erlang:element(10, Parser),
erlang:element(11, Parser),
erlang:element(12, Parser),
erlang:element(13, Parser)};
[] ->
Parser
end.
-file("src/taffy/parser/helpers.gleam", 30).
?DOC(false).
-spec backtrack(taffy@parser@types:parser()) -> taffy@parser@types:parser().
backtrack(Parser) ->
case erlang:element(3, Parser) of
[Last | Rest] ->
{parser,
[Last | erlang:element(2, Parser)],
Rest,
erlang:element(4, Parser) - 1,
erlang:element(5, Parser),
erlang:element(6, Parser),
erlang:element(7, Parser),
erlang:element(8, Parser),
erlang:element(9, Parser),
erlang:element(10, Parser),
erlang:element(11, Parser),
erlang:element(12, Parser),
erlang:element(13, Parser)};
[] ->
Parser
end.
-file("src/taffy/parser/helpers.gleam", 43).
?DOC(false).
-spec skip_whitespace(taffy@parser@types:parser()) -> taffy@parser@types:parser().
skip_whitespace(Parser) ->
case current(Parser) of
{some, newline} ->
skip_whitespace(advance(Parser));
{some, {indent, _}} ->
skip_whitespace(advance(Parser));
{some, {comment, _}} ->
skip_whitespace(advance(Parser));
_ ->
Parser
end.
-file("src/taffy/parser/helpers.gleam", 52).
?DOC(false).
-spec flow_whitespace_has_comment(taffy@parser@types:parser()) -> boolean().
flow_whitespace_has_comment(Parser) ->
case current(Parser) of
{some, {comment, _}} ->
true;
{some, newline} ->
flow_whitespace_has_comment(advance(Parser));
{some, {indent, _}} ->
flow_whitespace_has_comment(advance(Parser));
_ ->
false
end.
-file("src/taffy/parser/helpers.gleam", 61).
?DOC(false).
-spec skip_flow_whitespace(taffy@parser@types:parser()) -> {ok,
taffy@parser@types:parser()} |
{error, taffy@parser@types:parse_error()}.
skip_flow_whitespace(Parser) ->
case current(Parser) of
{some, newline} ->
Parser@1 = {parser,
erlang:element(2, Parser),
erlang:element(3, Parser),
erlang:element(4, Parser),
erlang:element(5, Parser),
erlang:element(6, Parser),
erlang:element(7, Parser),
erlang:element(8, Parser),
true,
erlang:element(10, Parser),
erlang:element(11, Parser),
erlang:element(12, Parser),
erlang:element(13, Parser)},
case erlang:element(8, Parser@1) > 0 of
true ->
After = advance(Parser@1),
case current(After) of
{some, newline} ->
skip_flow_whitespace(After);
{some, {indent, _}} ->
skip_flow_whitespace(After);
{some, {comment, _}} ->
skip_flow_whitespace(After);
{some, eof} ->
{ok, After};
none ->
{ok, After};
{some, bracket_close} ->
{ok, After};
{some, brace_close} ->
{ok, After};
{some, comma} ->
{ok, After};
_ ->
{error,
{parse_error,
<<"Flow content must be indented"/utf8>>,
erlang:element(4, Parser@1)}}
end;
false ->
skip_flow_whitespace(advance(Parser@1))
end;
{some, {indent, N}} ->
Parser@2 = {parser,
erlang:element(2, Parser),
erlang:element(3, Parser),
erlang:element(4, Parser),
erlang:element(5, Parser),
erlang:element(6, Parser),
erlang:element(7, Parser),
erlang:element(8, Parser),
true,
erlang:element(10, Parser),
erlang:element(11, Parser),
erlang:element(12, Parser),
erlang:element(13, Parser)},
case N >= erlang:element(8, Parser@2) of
true ->
skip_flow_whitespace(advance(Parser@2));
false ->
After@1 = advance(Parser@2),
case current(After@1) of
{some, bracket_close} ->
{ok, After@1};
{some, brace_close} ->
{ok, After@1};
{some, comma} ->
{ok, After@1};
_ ->
{error,
{parse_error,
<<"Flow content must be indented"/utf8>>,
erlang:element(4, Parser@2)}}
end
end;
{some, {comment, _}} ->
skip_flow_whitespace(advance(Parser));
_ ->
{ok, Parser}
end.
-file("src/taffy/parser/helpers.gleam", 110).
?DOC(false).
-spec skip_newlines_and_comments(taffy@parser@types:parser()) -> taffy@parser@types:parser().
skip_newlines_and_comments(Parser) ->
case current(Parser) of
{some, newline} ->
skip_newlines_and_comments(advance(Parser));
{some, {comment, _}} ->
skip_newlines_and_comments(advance(Parser));
{some, {indent, _}} ->
After_indent = advance(Parser),
case current(After_indent) of
{some, {comment, _}} ->
skip_newlines_and_comments(advance(After_indent));
{some, newline} ->
skip_newlines_and_comments(advance(After_indent));
_ ->
Parser
end;
_ ->
Parser
end.
-file("src/taffy/parser/helpers.gleam", 131).
?DOC(false).
-spec skip_newlines_and_comments_tracking_loop(
taffy@parser@types:parser(),
boolean()
) -> {boolean(), taffy@parser@types:parser()}.
skip_newlines_and_comments_tracking_loop(Parser, Skipped_newline) ->
case current(Parser) of
{some, newline} ->
skip_newlines_and_comments_tracking_loop(advance(Parser), true);
{some, {comment, _}} ->
skip_newlines_and_comments_tracking_loop(
advance(Parser),
Skipped_newline
);
{some, {indent, _}} ->
After_indent = advance(Parser),
case current(After_indent) of
{some, {comment, _}} ->
skip_newlines_and_comments_tracking_loop(
advance(After_indent),
Skipped_newline
);
{some, newline} ->
skip_newlines_and_comments_tracking_loop(
advance(After_indent),
true
);
_ ->
{Skipped_newline, Parser}
end;
_ ->
{Skipped_newline, Parser}
end.
-file("src/taffy/parser/helpers.gleam", 127).
?DOC(false).
-spec skip_newlines_and_comments_tracking(taffy@parser@types:parser()) -> {boolean(),
taffy@parser@types:parser()}.
skip_newlines_and_comments_tracking(Parser) ->
skip_newlines_and_comments_tracking_loop(Parser, false).
-file("src/taffy/parser/helpers.gleam", 160).
?DOC(false).
-spec is_terminator(gleam@option:option(taffy@lexer:token())) -> boolean().
is_terminator(Token) ->
case Token of
{some, newline} ->
true;
{some, {indent, _}} ->
true;
{some, {comment, _}} ->
true;
{some, eof} ->
true;
none ->
true;
_ ->
false
end.
-file("src/taffy/parser/helpers.gleam", 172).
?DOC(false).
-spec token_to_string(taffy@lexer:token()) -> binary().
token_to_string(Token) ->
case Token of
doc_start ->
<<"---"/utf8>>;
doc_end ->
<<"..."/utf8>>;
colon ->
<<":"/utf8>>;
question ->
<<"?"/utf8>>;
dash ->
<<"-"/utf8>>;
bracket_open ->
<<"["/utf8>>;
bracket_close ->
<<"]"/utf8>>;
brace_open ->
<<"{"/utf8>>;
brace_close ->
<<"}"/utf8>>;
comma ->
<<","/utf8>>;
{anchor, N} ->
<<"&"/utf8, N/binary>>;
{alias, N@1} ->
<<"*"/utf8, N@1/binary>>;
{tag, T} ->
T;
{literal, _} ->
<<"|"/utf8>>;
{folded, _} ->
<<">"/utf8>>;
{plain, S} ->
<<<<"plain("/utf8, S/binary>>/binary, ")"/utf8>>;
{single_quoted, S@1} ->
<<<<"'"/utf8, S@1/binary>>/binary, "'"/utf8>>;
{double_quoted, S@2} ->
<<<<"\""/utf8, S@2/binary>>/binary, "\""/utf8>>;
{comment, C} ->
<<"#"/utf8, C/binary>>;
newline ->
<<"\\n"/utf8>>;
{indent, N@2} ->
<<<<"indent("/utf8, (erlang:integer_to_binary(N@2))/binary>>/binary,
")"/utf8>>;
{directive, D} ->
<<"%"/utf8, D/binary>>;
eof ->
<<"EOF"/utf8>>
end.
-file("src/taffy/parser/helpers.gleam", 202).
?DOC(false).
-spec token_for_error(taffy@lexer:token()) -> binary().
token_for_error(Token) ->
case Token of
{plain, S} ->
S;
newline ->
<<"newline"/utf8>>;
{indent, _} ->
<<"indentation"/utf8>>;
{comment, _} ->
<<"comment"/utf8>>;
eof ->
<<"end of input"/utf8>>;
Other ->
token_to_string(Other)
end.