Packages

Code First GraphQL library for Gleam

Current section

Files

Jump to
mochi src mochi@parser.erl
Raw

src/mochi@parser.erl

-module(mochi@parser).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/mochi/parser.gleam").
-export([parse/1]).
-export_type([parse_error/0, parser/0]).
-type parse_error() :: {lex_error, mochi@lexer:lexer_error()} |
{unexpected_token, binary(), mochi@lexer:token(), mochi@lexer:position()} |
{unexpected_e_o_f, binary()}.
-type parser() :: {parser, list(mochi@lexer:token_with_position()), integer()}.
-file("src/mochi/parser.gleam", 374).
-spec token_as_name(mochi@lexer:token()) -> {ok, binary()} | {error, nil}.
token_as_name(Token) ->
case Token of
{name, Name} ->
{ok, Name};
'query' ->
{ok, <<"query"/utf8>>};
mutation ->
{ok, <<"mutation"/utf8>>};
subscription ->
{ok, <<"subscription"/utf8>>};
fragment ->
{ok, <<"fragment"/utf8>>};
on ->
{ok, <<"on"/utf8>>};
true_keyword ->
{ok, <<"true"/utf8>>};
false_keyword ->
{ok, <<"false"/utf8>>};
null_keyword ->
{ok, <<"null"/utf8>>};
_ ->
{error, nil}
end.
-file("src/mochi/parser.gleam", 433).
-spec get_token_at_helper(
list(mochi@lexer:token_with_position()),
integer(),
integer()
) -> {ok, mochi@lexer:token_with_position()} | {error, nil}.
get_token_at_helper(Tokens, Target_index, Current_index) ->
case Tokens of
[] ->
{error, nil};
[First | _] when Current_index =:= Target_index ->
{ok, First};
[_ | Rest] ->
get_token_at_helper(Rest, Target_index, Current_index + 1)
end.
-file("src/mochi/parser.gleam", 426).
-spec get_token_at(list(mochi@lexer:token_with_position()), integer()) -> {ok,
mochi@lexer:token_with_position()} |
{error, nil}.
get_token_at(Tokens, Index) ->
get_token_at_helper(Tokens, Index, 0).
-file("src/mochi/parser.gleam", 415).
-spec peek_token(parser()) -> {ok, mochi@lexer:token_with_position()} |
{error, nil}.
peek_token(Parser) ->
get_token_at(erlang:element(2, Parser), erlang:element(3, Parser)).
-file("src/mochi/parser.gleam", 419).
-spec consume_token(parser()) -> {ok,
{mochi@lexer:token_with_position(), parser()}} |
{error, nil}.
consume_token(Parser) ->
case get_token_at(erlang:element(2, Parser), erlang:element(3, Parser)) of
{ok, Token} ->
{ok,
{Token,
{parser,
erlang:element(2, Parser),
erlang:element(3, Parser) + 1}}};
{error, _} ->
{error, nil}
end.
-file("src/mochi/parser.gleam", 129).
-spec parse_operation_type(parser()) -> {ok,
{mochi@ast:operation_type(), parser()}} |
{error, parse_error()}.
parse_operation_type(Parser) ->
case consume_token(Parser) of
{ok, {{token_with_position, 'query', _}, Parser@1}} ->
{ok, {'query', Parser@1}};
{ok, {{token_with_position, mutation, _}, Parser@2}} ->
{ok, {mutation, Parser@2}};
{ok, {{token_with_position, subscription, _}, Parser@3}} ->
{ok, {subscription, Parser@3}};
{ok, {{token_with_position, Token, Position}, _}} ->
{error,
{unexpected_token,
<<"query, mutation, or subscription"/utf8>>,
Token,
Position}};
{error, _} ->
{error, {unexpected_e_o_f, <<"operation type"/utf8>>}}
end.
-file("src/mochi/parser.gleam", 145).
-spec parse_optional_name(parser()) -> {ok,
{gleam@option:option(binary()), parser()}} |
{error, parse_error()}.
parse_optional_name(Parser) ->
case peek_token(Parser) of
{ok, {token_with_position, {name, Name}, _}} ->
gleam@result:'try'(
begin
_pipe = consume_token(Parser),
gleam@result:map_error(
_pipe,
fun(_) -> {unexpected_e_o_f, <<"name"/utf8>>} end
)
end,
fun(_use0) ->
{_, Parser@1} = _use0,
{ok, {{some, Name}, Parser@1}}
end
);
_ ->
{ok, {none, Parser}}
end.
-file("src/mochi/parser.gleam", 389).
-spec parse_name_from_parser(parser()) -> {ok, {binary(), parser()}} |
{error, parse_error()}.
parse_name_from_parser(Parser) ->
case consume_token(Parser) of
{ok, {{token_with_position, Token, Position}, Parser@1}} ->
case token_as_name(Token) of
{ok, Name} ->
{ok, {Name, Parser@1}};
{error, _} ->
{error,
{unexpected_token, <<"name"/utf8>>, Token, Position}}
end;
{error, _} ->
{error, {unexpected_e_o_f, <<"name"/utf8>>}}
end.
-file("src/mochi/parser.gleam", 402).
-spec parse_name_with_position(parser()) -> {ok,
{binary(), mochi@lexer:position(), parser()}} |
{error, parse_error()}.
parse_name_with_position(Parser) ->
case consume_token(Parser) of
{ok, {{token_with_position, Token, Position}, Parser@1}} ->
case token_as_name(Token) of
{ok, Name} ->
{ok, {Name, Position, Parser@1}};
{error, _} ->
{error,
{unexpected_token, <<"name"/utf8>>, Token, Position}}
end;
{error, _} ->
{error, {unexpected_e_o_f, <<"name"/utf8>>}}
end.
-file("src/mochi/parser.gleam", 445).
-spec expect_token(parser(), mochi@lexer:token(), binary()) -> {ok,
{mochi@lexer:token_with_position(), parser()}} |
{error, parse_error()}.
expect_token(Parser, Expected, Description) ->
case consume_token(Parser) of
{ok, {{token_with_position, Token, Position}, Parser@1}} ->
case Token =:= Expected of
true ->
{ok, {{token_with_position, Token, Position}, Parser@1}};
false ->
{error, {unexpected_token, Description, Token, Position}}
end;
{error, _} ->
{error, {unexpected_e_o_f, Description}}
end.
-file("src/mochi/parser.gleam", 578).
-spec parse_optional_non_null(parser(), mochi@ast:type()) -> {ok,
{mochi@ast:type(), parser()}} |
{error, parse_error()}.
parse_optional_non_null(Parser, Base_type) ->
case peek_token(Parser) of
{ok, {token_with_position, bang, _}} ->
gleam@result:'try'(
begin
_pipe = consume_token(Parser),
gleam@result:map_error(
_pipe,
fun(_) -> {unexpected_e_o_f, <<"'!'"/utf8>>} end
)
end,
fun(_use0) ->
{_, Parser@1} = _use0,
{ok, {{non_null_type, Base_type}, Parser@1}}
end
);
_ ->
{ok, {Base_type, Parser}}
end.
-file("src/mochi/parser.gleam", 542).
-spec parse_type(parser()) -> {ok, {mochi@ast:type(), parser()}} |
{error, parse_error()}.
parse_type(Parser) ->
case peek_token(Parser) of
{ok, {token_with_position, left_bracket, _}} ->
gleam@result:'try'(
begin
_pipe = consume_token(Parser),
gleam@result:map_error(
_pipe,
fun(_) -> {unexpected_e_o_f, <<"'['"/utf8>>} end
)
end,
fun(_use0) ->
{_, Parser@1} = _use0,
gleam@result:'try'(
parse_type(Parser@1),
fun(_use0@1) ->
{Inner_type, Parser@2} = _use0@1,
gleam@result:'try'(
expect_token(
Parser@2,
right_bracket,
<<"']' to close list type"/utf8>>
),
fun(_use0@2) ->
{_, Parser@3} = _use0@2,
gleam@result:'try'(
parse_optional_non_null(
Parser@3,
{list_type, Inner_type}
),
fun(_use0@3) ->
{Final_type, Parser@4} = _use0@3,
{ok, {Final_type, Parser@4}}
end
)
end
)
end
)
end
);
{ok, {token_with_position, {name, _}, _}} ->
gleam@result:'try'(
parse_name_from_parser(Parser),
fun(_use0@4) ->
{Name, Parser@5} = _use0@4,
gleam@result:'try'(
parse_optional_non_null(Parser@5, {named_type, Name}),
fun(_use0@5) ->
{Final_type@1, Parser@6} = _use0@5,
{ok, {Final_type@1, Parser@6}}
end
)
end
);
{ok, {token_with_position, Token, Position}} ->
{error,
{unexpected_token, <<"type name or '['"/utf8>>, Token, Position}};
{error, _} ->
{error, {unexpected_e_o_f, <<"type"/utf8>>}}
end.
-file("src/mochi/parser.gleam", 202).
-spec parse_fragment_spread_or_inline(parser()) -> {ok,
{mochi@ast:selection(), parser()}} |
{error, parse_error()}.
parse_fragment_spread_or_inline(Parser) ->
gleam@result:'try'(
expect_token(Parser, spread, <<"'...' for fragment"/utf8>>),
fun(_use0) ->
{_, Parser@1} = _use0,
case peek_token(Parser@1) of
{ok, {token_with_position, on, _}} ->
gleam@result:'try'(
begin
_pipe = consume_token(Parser@1),
gleam@result:map_error(
_pipe,
fun(_) ->
{unexpected_e_o_f, <<"'on' keyword"/utf8>>}
end
)
end,
fun(_use0@1) ->
{_, Parser@2} = _use0@1,
gleam@result:'try'(
parse_name_from_parser(Parser@2),
fun(_use0@2) ->
{Type_name, Parser@3} = _use0@2,
gleam@result:'try'(
parse_directives(Parser@3),
fun(_use0@3) ->
{Directives, Parser@4} = _use0@3,
gleam@result:'try'(
parse_selection_set(Parser@4),
fun(_use0@4) ->
{Selection_set, Parser@5} = _use0@4,
{ok,
{{inline_fragment,
{inline_fragment_value,
{some,
Type_name},
Directives,
Selection_set}},
Parser@5}}
end
)
end
)
end
)
end
);
{ok, {token_with_position, left_brace, _}} ->
gleam@result:'try'(
parse_directives(Parser@1),
fun(_use0@5) ->
{Directives@1, Parser@6} = _use0@5,
gleam@result:'try'(
parse_selection_set(Parser@6),
fun(_use0@6) ->
{Selection_set@1, Parser@7} = _use0@6,
{ok,
{{inline_fragment,
{inline_fragment_value,
none,
Directives@1,
Selection_set@1}},
Parser@7}}
end
)
end
);
{ok, {token_with_position, at, _}} ->
gleam@result:'try'(
parse_directives(Parser@1),
fun(_use0@5) ->
{Directives@1, Parser@6} = _use0@5,
gleam@result:'try'(
parse_selection_set(Parser@6),
fun(_use0@6) ->
{Selection_set@1, Parser@7} = _use0@6,
{ok,
{{inline_fragment,
{inline_fragment_value,
none,
Directives@1,
Selection_set@1}},
Parser@7}}
end
)
end
);
{ok, {token_with_position, {name, Name}, _}} ->
gleam@result:'try'(
begin
_pipe@1 = consume_token(Parser@1),
gleam@result:map_error(
_pipe@1,
fun(_) ->
{unexpected_e_o_f, <<"fragment name"/utf8>>}
end
)
end,
fun(_use0@7) ->
{_, Parser@8} = _use0@7,
gleam@result:'try'(
parse_directives(Parser@8),
fun(_use0@8) ->
{Directives@2, Parser@9} = _use0@8,
{ok,
{{fragment_spread,
{fragment_spread_value,
Name,
Directives@2}},
Parser@9}}
end
)
end
);
{ok, {token_with_position, Token, Position}} ->
{error,
{unexpected_token,
<<"'on', '{', or fragment name after '...'"/utf8>>,
Token,
Position}};
{error, _} ->
{error,
{unexpected_e_o_f,
<<"'on', '{', or fragment name after '...'"/utf8>>}}
end
end
).
-file("src/mochi/parser.gleam", 160).
-spec parse_selection_set(parser()) -> {ok,
{mochi@ast:selection_set(), parser()}} |
{error, parse_error()}.
parse_selection_set(Parser) ->
gleam@result:'try'(
expect_token(Parser, left_brace, <<"'{' to start selection set"/utf8>>),
fun(_use0) ->
{_, Parser@1} = _use0,
gleam@result:'try'(
parse_selections(Parser@1, []),
fun(_use0@1) ->
{Selections, Parser@2} = _use0@1,
gleam@result:'try'(
expect_token(
Parser@2,
right_brace,
<<"'}' to end selection set"/utf8>>
),
fun(_use0@2) ->
{_, Parser@3} = _use0@2,
{ok, {{selection_set, Selections}, Parser@3}}
end
)
end
)
end
).
-file("src/mochi/parser.gleam", 177).
-spec parse_selections(parser(), list(mochi@ast:selection())) -> {ok,
{list(mochi@ast:selection()), parser()}} |
{error, parse_error()}.
parse_selections(Parser, Acc) ->
case peek_token(Parser) of
{ok, {token_with_position, right_brace, _}} ->
{ok, {lists:reverse(Acc), Parser}};
{ok, _} ->
gleam@result:'try'(
parse_selection(Parser),
fun(_use0) ->
{Selection, Parser@1} = _use0,
parse_selections(Parser@1, [Selection | Acc])
end
);
{error, _} ->
{error, {unexpected_e_o_f, <<"selection or '}'"/utf8>>}}
end.
-file("src/mochi/parser.gleam", 192).
-spec parse_selection(parser()) -> {ok, {mochi@ast:selection(), parser()}} |
{error, parse_error()}.
parse_selection(Parser) ->
case peek_token(Parser) of
{ok, {token_with_position, spread, _}} ->
parse_fragment_spread_or_inline(Parser);
_ ->
_pipe = parse_field(Parser),
gleam@result:map(
_pipe,
fun(Result) ->
{{field_selection, erlang:element(1, Result)},
erlang:element(2, Result)}
end
)
end.
-file("src/mochi/parser.gleam", 360).
-spec parse_optional_selection_set(parser()) -> {gleam@option:option(mochi@ast:selection_set()),
parser()}.
parse_optional_selection_set(Parser) ->
case peek_token(Parser) of
{ok, {token_with_position, left_brace, _}} ->
case parse_selection_set(Parser) of
{ok, {Ss, P}} ->
{{some, Ss}, P};
{error, _} ->
{none, Parser}
end;
_ ->
{none, Parser}
end.
-file("src/mochi/parser.gleam", 709).
-spec parse_list_values(parser(), list(mochi@ast:value())) -> {ok,
{list(mochi@ast:value()), parser()}} |
{error, parse_error()}.
parse_list_values(Parser, Acc) ->
case peek_token(Parser) of
{ok, {token_with_position, right_bracket, _}} ->
{ok, {lists:reverse(Acc), Parser}};
_ ->
gleam@result:'try'(
parse_value(Parser),
fun(_use0) ->
{Value, Parser@1} = _use0,
parse_list_values(Parser@1, [Value | Acc])
end
)
end.
-file("src/mochi/parser.gleam", 614).
-spec parse_value(parser()) -> {ok, {mochi@ast:value(), parser()}} |
{error, parse_error()}.
parse_value(Parser) ->
case peek_token(Parser) of
{ok, {token_with_position, dollar, _}} ->
gleam@result:'try'(
begin
_pipe = consume_token(Parser),
gleam@result:map_error(
_pipe,
fun(_) -> {unexpected_e_o_f, <<"'$'"/utf8>>} end
)
end,
fun(_use0) ->
{_, Parser@1} = _use0,
gleam@result:'try'(
parse_name_from_parser(Parser@1),
fun(_use0@1) ->
{Name, Parser@2} = _use0@1,
{ok, {{variable_value, Name}, Parser@2}}
end
)
end
);
{ok, {token_with_position, {int_value, Value}, _}} ->
gleam@result:'try'(
begin
_pipe@1 = consume_token(Parser),
gleam@result:map_error(
_pipe@1,
fun(_) -> {unexpected_e_o_f, <<"int value"/utf8>>} end
)
end,
fun(_use0@2) ->
{_, Parser@3} = _use0@2,
{ok, {{int_value, Value}, Parser@3}}
end
);
{ok, {token_with_position, {float_value, Value@1}, _}} ->
gleam@result:'try'(
begin
_pipe@2 = consume_token(Parser),
gleam@result:map_error(
_pipe@2,
fun(_) -> {unexpected_e_o_f, <<"float value"/utf8>>} end
)
end,
fun(_use0@3) ->
{_, Parser@4} = _use0@3,
{ok, {{float_value, Value@1}, Parser@4}}
end
);
{ok, {token_with_position, {string_value, Value@2}, _}} ->
gleam@result:'try'(
begin
_pipe@3 = consume_token(Parser),
gleam@result:map_error(
_pipe@3,
fun(_) ->
{unexpected_e_o_f, <<"string value"/utf8>>}
end
)
end,
fun(_use0@4) ->
{_, Parser@5} = _use0@4,
{ok, {{string_value, Value@2}, Parser@5}}
end
);
{ok, {token_with_position, true_keyword, _}} ->
gleam@result:'try'(
begin
_pipe@4 = consume_token(Parser),
gleam@result:map_error(
_pipe@4,
fun(_) -> {unexpected_e_o_f, <<"true"/utf8>>} end
)
end,
fun(_use0@5) ->
{_, Parser@6} = _use0@5,
{ok, {{boolean_value, true}, Parser@6}}
end
);
{ok, {token_with_position, false_keyword, _}} ->
gleam@result:'try'(
begin
_pipe@5 = consume_token(Parser),
gleam@result:map_error(
_pipe@5,
fun(_) -> {unexpected_e_o_f, <<"false"/utf8>>} end
)
end,
fun(_use0@6) ->
{_, Parser@7} = _use0@6,
{ok, {{boolean_value, false}, Parser@7}}
end
);
{ok, {token_with_position, null_keyword, _}} ->
gleam@result:'try'(
begin
_pipe@6 = consume_token(Parser),
gleam@result:map_error(
_pipe@6,
fun(_) -> {unexpected_e_o_f, <<"null"/utf8>>} end
)
end,
fun(_use0@7) ->
{_, Parser@8} = _use0@7,
{ok, {null_value, Parser@8}}
end
);
{ok, {token_with_position, left_bracket, _}} ->
gleam@result:'try'(
begin
_pipe@7 = consume_token(Parser),
gleam@result:map_error(
_pipe@7,
fun(_) -> {unexpected_e_o_f, <<"'['"/utf8>>} end
)
end,
fun(_use0@8) ->
{_, Parser@9} = _use0@8,
gleam@result:'try'(
parse_list_values(Parser@9, []),
fun(_use0@9) ->
{Values, Parser@10} = _use0@9,
gleam@result:'try'(
expect_token(
Parser@10,
right_bracket,
<<"']' to close list value"/utf8>>
),
fun(_use0@10) ->
{_, Parser@11} = _use0@10,
{ok, {{list_value, Values}, Parser@11}}
end
)
end
)
end
);
{ok, {token_with_position, left_brace, _}} ->
gleam@result:'try'(
begin
_pipe@8 = consume_token(Parser),
gleam@result:map_error(
_pipe@8,
fun(_) -> {unexpected_e_o_f, <<"'{'"/utf8>>} end
)
end,
fun(_use0@11) ->
{_, Parser@12} = _use0@11,
gleam@result:'try'(
parse_object_fields(Parser@12, []),
fun(_use0@12) ->
{Fields, Parser@13} = _use0@12,
gleam@result:'try'(
expect_token(
Parser@13,
right_brace,
<<"'}' to close object value"/utf8>>
),
fun(_use0@13) ->
{_, Parser@14} = _use0@13,
{ok, {{object_value, Fields}, Parser@14}}
end
)
end
)
end
);
{ok, {token_with_position, {name, Value@3}, _}} ->
gleam@result:'try'(
begin
_pipe@9 = consume_token(Parser),
gleam@result:map_error(
_pipe@9,
fun(_) -> {unexpected_e_o_f, <<"enum value"/utf8>>} end
)
end,
fun(_use0@14) ->
{_, Parser@15} = _use0@14,
{ok, {{enum_value, Value@3}, Parser@15}}
end
);
{ok, {token_with_position, Token, Position}} ->
{error, {unexpected_token, <<"value"/utf8>>, Token, Position}};
{error, _} ->
{error, {unexpected_e_o_f, <<"value"/utf8>>}}
end.
-file("src/mochi/parser.gleam", 594).
-spec parse_optional_default_value(parser()) -> {ok,
{gleam@option:option(mochi@ast:value()), parser()}} |
{error, parse_error()}.
parse_optional_default_value(Parser) ->
case peek_token(Parser) of
{ok, {token_with_position, equals, _}} ->
gleam@result:'try'(
begin
_pipe = consume_token(Parser),
gleam@result:map_error(
_pipe,
fun(_) -> {unexpected_e_o_f, <<"'='"/utf8>>} end
)
end,
fun(_use0) ->
{_, Parser@1} = _use0,
gleam@result:'try'(
parse_value(Parser@1),
fun(_use0@1) ->
{Value, Parser@2} = _use0@1,
{ok, {{some, Value}, Parser@2}}
end
)
end
);
_ ->
{ok, {none, Parser}}
end.
-file("src/mochi/parser.gleam", 723).
-spec parse_object_fields(parser(), list(mochi@ast:object_field())) -> {ok,
{list(mochi@ast:object_field()), parser()}} |
{error, parse_error()}.
parse_object_fields(Parser, Acc) ->
case peek_token(Parser) of
{ok, {token_with_position, right_brace, _}} ->
{ok, {lists:reverse(Acc), Parser}};
{ok, {token_with_position, {name, _}, _}} ->
gleam@result:'try'(
parse_name_from_parser(Parser),
fun(_use0) ->
{Name, Parser@1} = _use0,
gleam@result:'try'(
expect_token(
Parser@1,
colon,
<<"':' after field name"/utf8>>
),
fun(_use0@1) ->
{_, Parser@2} = _use0@1,
gleam@result:'try'(
parse_value(Parser@2),
fun(_use0@2) ->
{Value, Parser@3} = _use0@2,
parse_object_fields(
Parser@3,
[{object_field, Name, Value} | Acc]
)
end
)
end
)
end
);
{ok, {token_with_position, Token, Position}} ->
{error,
{unexpected_token,
<<"object field or '}'"/utf8>>,
Token,
Position}};
{error, _} ->
{error, {unexpected_e_o_f, <<"object field or '}'"/utf8>>}}
end.
-file("src/mochi/parser.gleam", 771).
-spec parse_arguments_list(parser(), list(mochi@ast:argument())) -> {ok,
{list(mochi@ast:argument()), parser()}} |
{error, parse_error()}.
parse_arguments_list(Parser, Acc) ->
case peek_token(Parser) of
{ok, {token_with_position, right_paren, _}} ->
{ok, {lists:reverse(Acc), Parser}};
{ok, {token_with_position, {name, _}, _}} ->
gleam@result:'try'(
parse_name_from_parser(Parser),
fun(_use0) ->
{Name, Parser@1} = _use0,
gleam@result:'try'(
expect_token(
Parser@1,
colon,
<<"':' after argument name"/utf8>>
),
fun(_use0@1) ->
{_, Parser@2} = _use0@1,
gleam@result:'try'(
parse_value(Parser@2),
fun(_use0@2) ->
{Value, Parser@3} = _use0@2,
parse_arguments_list(
Parser@3,
[{argument, Name, Value} | Acc]
)
end
)
end
)
end
);
{ok, {token_with_position, Token, Position}} ->
{error,
{unexpected_token, <<"argument or ')'"/utf8>>, Token, Position}};
{error, _} ->
{error, {unexpected_e_o_f, <<"argument or ')'"/utf8>>}}
end.
-file("src/mochi/parser.gleam", 750).
-spec parse_arguments(parser()) -> {ok, {list(mochi@ast:argument()), parser()}} |
{error, parse_error()}.
parse_arguments(Parser) ->
case peek_token(Parser) of
{ok, {token_with_position, left_paren, _}} ->
gleam@result:'try'(
begin
_pipe = consume_token(Parser),
gleam@result:map_error(
_pipe,
fun(_) -> {unexpected_e_o_f, <<"'('"/utf8>>} end
)
end,
fun(_use0) ->
{_, Parser@1} = _use0,
gleam@result:'try'(
parse_arguments_list(Parser@1, []),
fun(_use0@1) ->
{Args, Parser@2} = _use0@1,
gleam@result:'try'(
expect_token(
Parser@2,
right_paren,
<<"')' to close arguments"/utf8>>
),
fun(_use0@2) ->
{_, Parser@3} = _use0@2,
{ok, {Args, Parser@3}}
end
)
end
)
end
);
_ ->
{ok, {[], Parser}}
end.
-file("src/mochi/parser.gleam", 343).
-spec parse_directive(parser()) -> {ok, {mochi@ast:directive(), parser()}} |
{error, parse_error()}.
parse_directive(Parser) ->
gleam@result:'try'(
expect_token(Parser, at, <<"'@' for directive"/utf8>>),
fun(_use0) ->
{_, Parser@1} = _use0,
gleam@result:'try'(
parse_name_from_parser(Parser@1),
fun(_use0@1) ->
{Name, Parser@2} = _use0@1,
gleam@result:'try'(
parse_arguments(Parser@2),
fun(_use0@2) ->
{Arguments, Parser@3} = _use0@2,
{ok, {{directive, Name, Arguments}, Parser@3}}
end
)
end
)
end
).
-file("src/mochi/parser.gleam", 330).
-spec parse_directives_list(parser(), list(mochi@ast:directive())) -> {ok,
{list(mochi@ast:directive()), parser()}} |
{error, parse_error()}.
parse_directives_list(Parser, Acc) ->
case peek_token(Parser) of
{ok, {token_with_position, at, _}} ->
gleam@result:'try'(
parse_directive(Parser),
fun(_use0) ->
{Directive, Parser@1} = _use0,
parse_directives_list(Parser@1, [Directive | Acc])
end
);
_ ->
{ok, {lists:reverse(Acc), Parser}}
end.
-file("src/mochi/parser.gleam", 324).
-spec parse_directives(parser()) -> {ok,
{list(mochi@ast:directive()), parser()}} |
{error, parse_error()}.
parse_directives(Parser) ->
parse_directives_list(Parser, []).
-file("src/mochi/parser.gleam", 64).
-spec parse_fragment_definition(parser()) -> {ok,
{mochi@ast:fragment(), parser()}} |
{error, parse_error()}.
parse_fragment_definition(Parser) ->
gleam@result:'try'(
expect_token(Parser, fragment, <<"'fragment' keyword"/utf8>>),
fun(_use0) ->
{_, Parser@1} = _use0,
gleam@result:'try'(
parse_name_from_parser(Parser@1),
fun(_use0@1) ->
{Name, Parser@2} = _use0@1,
gleam@result:'try'(
expect_token(Parser@2, on, <<"'on' keyword"/utf8>>),
fun(_use0@2) ->
{_, Parser@3} = _use0@2,
gleam@result:'try'(
parse_name_from_parser(Parser@3),
fun(_use0@3) ->
{Type_condition, Parser@4} = _use0@3,
gleam@result:'try'(
parse_directives(Parser@4),
fun(_use0@4) ->
{Directives, Parser@5} = _use0@4,
gleam@result:'try'(
parse_selection_set(Parser@5),
fun(_use0@5) ->
{Selection_set, Parser@6} = _use0@5,
{ok,
{{fragment,
Name,
Type_condition,
Directives,
Selection_set},
Parser@6}}
end
)
end
)
end
)
end
)
end
)
end
).
-file("src/mochi/parser.gleam", 270).
-spec parse_field(parser()) -> {ok, {mochi@ast:field(), parser()}} |
{error, parse_error()}.
parse_field(Parser) ->
gleam@result:'try'(
parse_name_with_position(Parser),
fun(_use0) ->
{First_name, First_pos, Parser@1} = _use0,
case peek_token(Parser@1) of
{ok, {token_with_position, colon, _}} ->
gleam@result:'try'(
begin
_pipe = consume_token(Parser@1),
gleam@result:map_error(
_pipe,
fun(_) ->
{unexpected_e_o_f, <<"colon"/utf8>>}
end
)
end,
fun(_use0@1) ->
{_, Parser@2} = _use0@1,
gleam@result:'try'(
parse_name_from_parser(Parser@2),
fun(_use0@2) ->
{Second_name, Parser@3} = _use0@2,
gleam@result:'try'(
parse_arguments(Parser@3),
fun(_use0@3) ->
{Arguments, Parser@4} = _use0@3,
gleam@result:'try'(
parse_directives(Parser@4),
fun(_use0@4) ->
{Directives, Parser@5} = _use0@4,
{Selection_set, Parser@6} = parse_optional_selection_set(
Parser@5
),
{ok,
{{field,
{some,
First_name},
Second_name,
Arguments,
Directives,
Selection_set,
{some,
First_pos}},
Parser@6}}
end
)
end
)
end
)
end
);
_ ->
gleam@result:'try'(
parse_arguments(Parser@1),
fun(_use0@5) ->
{Arguments@1, Parser@7} = _use0@5,
gleam@result:'try'(
parse_directives(Parser@7),
fun(_use0@6) ->
{Directives@1, Parser@8} = _use0@6,
{Selection_set@1, Parser@9} = parse_optional_selection_set(
Parser@8
),
{ok,
{{field,
none,
First_name,
Arguments@1,
Directives@1,
Selection_set@1,
{some, First_pos}},
Parser@9}}
end
)
end
)
end
end
).
-file("src/mochi/parser.gleam", 505).
-spec parse_variable_definition(parser()) -> {ok,
{mochi@ast:variable_definition(), parser()}} |
{error, parse_error()}.
parse_variable_definition(Parser) ->
gleam@result:'try'(
expect_token(Parser, dollar, <<"'$' for variable"/utf8>>),
fun(_use0) ->
{_, Parser@1} = _use0,
gleam@result:'try'(
parse_name_from_parser(Parser@1),
fun(_use0@1) ->
{Name, Parser@2} = _use0@1,
gleam@result:'try'(
expect_token(
Parser@2,
colon,
<<"':' after variable name"/utf8>>
),
fun(_use0@2) ->
{_, Parser@3} = _use0@2,
gleam@result:'try'(
parse_type(Parser@3),
fun(_use0@3) ->
{Var_type, Parser@4} = _use0@3,
gleam@result:'try'(
parse_optional_default_value(Parser@4),
fun(_use0@4) ->
{Default_value, Parser@5} = _use0@4,
gleam@result:'try'(
parse_directives(Parser@5),
fun(_use0@5) ->
{Directives, Parser@6} = _use0@5,
{ok,
{{variable_definition,
Name,
Var_type,
Default_value,
Directives},
Parser@6}}
end
)
end
)
end
)
end
)
end
)
end
).
-file("src/mochi/parser.gleam", 488).
-spec parse_variable_definitions_list(
parser(),
list(mochi@ast:variable_definition())
) -> {ok, {list(mochi@ast:variable_definition()), parser()}} |
{error, parse_error()}.
parse_variable_definitions_list(Parser, Acc) ->
case peek_token(Parser) of
{ok, {token_with_position, right_paren, _}} ->
{ok, {lists:reverse(Acc), Parser}};
{ok, {token_with_position, dollar, _}} ->
gleam@result:'try'(
parse_variable_definition(Parser),
fun(_use0) ->
{Var_def, Parser@1} = _use0,
parse_variable_definitions_list(Parser@1, [Var_def | Acc])
end
);
{ok, {token_with_position, Token, Position}} ->
{error,
{unexpected_token,
<<"variable definition or ')'"/utf8>>,
Token,
Position}};
{error, _} ->
{error, {unexpected_e_o_f, <<"variable definition or ')'"/utf8>>}}
end.
-file("src/mochi/parser.gleam", 465).
-spec parse_variable_definitions(parser()) -> {ok,
{list(mochi@ast:variable_definition()), parser()}} |
{error, parse_error()}.
parse_variable_definitions(Parser) ->
case peek_token(Parser) of
{ok, {token_with_position, left_paren, _}} ->
gleam@result:'try'(
begin
_pipe = consume_token(Parser),
gleam@result:map_error(
_pipe,
fun(_) -> {unexpected_e_o_f, <<"'('"/utf8>>} end
)
end,
fun(_use0) ->
{_, Parser@1} = _use0,
gleam@result:'try'(
parse_variable_definitions_list(Parser@1, []),
fun(_use0@1) ->
{Defs, Parser@2} = _use0@1,
gleam@result:'try'(
expect_token(
Parser@2,
right_paren,
<<"')' to end variable definitions"/utf8>>
),
fun(_use0@2) ->
{_, Parser@3} = _use0@2,
{ok, {Defs, Parser@3}}
end
)
end
)
end
);
_ ->
{ok, {[], Parser}}
end.
-file("src/mochi/parser.gleam", 94).
-spec parse_operation_definition(parser()) -> {ok,
{mochi@ast:operation(), parser()}} |
{error, parse_error()}.
parse_operation_definition(Parser) ->
case peek_token(Parser) of
{ok, {token_with_position, left_brace, _}} ->
gleam@result:'try'(
parse_selection_set(Parser),
fun(_use0) ->
{Selection_set, Parser@1} = _use0,
{ok, {{shorthand_query, Selection_set}, Parser@1}}
end
);
{ok, {token_with_position, 'query', _}} ->
gleam@result:'try'(
parse_operation_type(Parser),
fun(_use0@1) ->
{Op_type, Parser@2} = _use0@1,
gleam@result:'try'(
parse_optional_name(Parser@2),
fun(_use0@2) ->
{Name, Parser@3} = _use0@2,
gleam@result:'try'(
parse_variable_definitions(Parser@3),
fun(_use0@3) ->
{Variable_defs, Parser@4} = _use0@3,
gleam@result:'try'(
parse_directives(Parser@4),
fun(_use0@4) ->
{Directives, Parser@5} = _use0@4,
gleam@result:'try'(
parse_selection_set(Parser@5),
fun(_use0@5) ->
{Selection_set@1, Parser@6} = _use0@5,
{ok,
{{operation,
Op_type,
Name,
Variable_defs,
Directives,
Selection_set@1},
Parser@6}}
end
)
end
)
end
)
end
)
end
);
{ok, {token_with_position, mutation, _}} ->
gleam@result:'try'(
parse_operation_type(Parser),
fun(_use0@1) ->
{Op_type, Parser@2} = _use0@1,
gleam@result:'try'(
parse_optional_name(Parser@2),
fun(_use0@2) ->
{Name, Parser@3} = _use0@2,
gleam@result:'try'(
parse_variable_definitions(Parser@3),
fun(_use0@3) ->
{Variable_defs, Parser@4} = _use0@3,
gleam@result:'try'(
parse_directives(Parser@4),
fun(_use0@4) ->
{Directives, Parser@5} = _use0@4,
gleam@result:'try'(
parse_selection_set(Parser@5),
fun(_use0@5) ->
{Selection_set@1, Parser@6} = _use0@5,
{ok,
{{operation,
Op_type,
Name,
Variable_defs,
Directives,
Selection_set@1},
Parser@6}}
end
)
end
)
end
)
end
)
end
);
{ok, {token_with_position, subscription, _}} ->
gleam@result:'try'(
parse_operation_type(Parser),
fun(_use0@1) ->
{Op_type, Parser@2} = _use0@1,
gleam@result:'try'(
parse_optional_name(Parser@2),
fun(_use0@2) ->
{Name, Parser@3} = _use0@2,
gleam@result:'try'(
parse_variable_definitions(Parser@3),
fun(_use0@3) ->
{Variable_defs, Parser@4} = _use0@3,
gleam@result:'try'(
parse_directives(Parser@4),
fun(_use0@4) ->
{Directives, Parser@5} = _use0@4,
gleam@result:'try'(
parse_selection_set(Parser@5),
fun(_use0@5) ->
{Selection_set@1, Parser@6} = _use0@5,
{ok,
{{operation,
Op_type,
Name,
Variable_defs,
Directives,
Selection_set@1},
Parser@6}}
end
)
end
)
end
)
end
)
end
);
{ok, {token_with_position, Token, Position}} ->
{error,
{unexpected_token,
<<"operation or selection set"/utf8>>,
Token,
Position}};
{error, _} ->
{error, {unexpected_e_o_f, <<"operation or selection set"/utf8>>}}
end.
-file("src/mochi/parser.gleam", 49).
-spec parse_definition(parser()) -> {ok, {mochi@ast:definition(), parser()}} |
{error, parse_error()}.
parse_definition(Parser) ->
case peek_token(Parser) of
{ok, {token_with_position, fragment, _}} ->
_pipe = parse_fragment_definition(Parser),
gleam@result:map(
_pipe,
fun(Result) ->
{{fragment_definition, erlang:element(1, Result)},
erlang:element(2, Result)}
end
);
_ ->
_pipe@1 = parse_operation_definition(Parser),
gleam@result:map(
_pipe@1,
fun(Result@1) ->
{{operation_definition, erlang:element(1, Result@1)},
erlang:element(2, Result@1)}
end
)
end.
-file("src/mochi/parser.gleam", 34).
-spec parse_definitions(parser(), list(mochi@ast:definition())) -> {ok,
{list(mochi@ast:definition()), parser()}} |
{error, parse_error()}.
parse_definitions(Parser, Acc) ->
case peek_token(Parser) of
{ok, {token_with_position, e_o_f, _}} ->
{ok, {lists:reverse(Acc), Parser}};
{ok, _} ->
gleam@result:'try'(
parse_definition(Parser),
fun(_use0) ->
{Definition, Parser@1} = _use0,
parse_definitions(Parser@1, [Definition | Acc])
end
);
{error, _} ->
{ok, {lists:reverse(Acc), Parser}}
end.
-file("src/mochi/parser.gleam", 29).
-spec parse_document(parser()) -> {ok, {mochi@ast:document(), parser()}} |
{error, parse_error()}.
parse_document(Parser) ->
gleam@result:'try'(
parse_definitions(Parser, []),
fun(_use0) ->
{Definitions, Parser@1} = _use0,
{ok, {{document, Definitions}, Parser@1}}
end
).
-file("src/mochi/parser.gleam", 22).
-spec parse(binary()) -> {ok, mochi@ast:document()} | {error, parse_error()}.
parse(Input) ->
gleam@result:'try'(
begin
_pipe = mochi@lexer:tokenize(Input),
gleam@result:map_error(
_pipe,
fun(Field@0) -> {lex_error, Field@0} end
)
end,
fun(Tokens) ->
Parser = {parser, Tokens, 0},
_pipe@1 = parse_document(Parser),
gleam@result:map(
_pipe@1,
fun(Result) -> erlang:element(1, Result) end
)
end
).