Current section
Files
Jump to
Current section
Files
src/mochi@query.erl
-module(mochi@query).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/mochi/query.gleam").
-export([with_encoder/2, with_guard/2, with_description/2, get_name/1, get_description/1, get_args/1, 'query'/3, query_with_args/4, mutation/3, mutation_with_args/4, subscription/3, subscription_with_args/4, field/4, field_with_args/5, all_of/1, any_of/1, arg/2, arg_with_desc/3, arg_with_default/3, arg_with_default_desc/4, get_string/2, get_id/2, get_int/2, get_float/2, get_bool/2, get_optional_string/2, get_optional_id/2, get_optional_int/2, get_optional_float/2, get_optional_bool/2, get_string_list/2, get_int_list/2, decode_input/3, get_dynamic/2, get_optional_dynamic/2, get_string_or/3, get_id_or/3, get_int_or/3, get_float_or/3, get_bool_or/3, to_field_def/1, new/0, add_query/2, add_mutation/2, add_subscription/2, add_type/2, add_enum/2, add_interface/2, add_union/2, add_scalar/2, add_input/2, add_queries/2, add_mutations/2, add_subscriptions/2, add_types/2, add_enums/2, add_interfaces/2, add_unions/2, add_scalars/2, add_inputs/2, with_common_scalars/1, merge/2, with_cache/1, build/1]).
-export_type([query_kind/0, mutation_kind/0, subscription_kind/0, field_kind/1, internal_resolver/1, op/2, arg_def/0, schema_builder/0]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
-type query_kind() :: query_kind.
-type mutation_kind() :: mutation_kind.
-type subscription_kind() :: subscription_kind.
-opaque field_kind(LZF) :: {field_kind, fun((LZF) -> LZF)}.
-type internal_resolver(LZG) :: {simple_resolver,
fun((gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), mochi@schema:execution_context()) -> {ok,
LZG} |
{error, mochi@error:graph_q_l_error()})} |
{topic_resolver,
fun((gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), mochi@schema:execution_context()) -> {ok,
binary()} |
{error, mochi@error:graph_q_l_error()})} |
{parent_resolver,
fun((gleam@option:option(gleam@dynamic:dynamic_()), gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), mochi@schema:execution_context()) -> {ok,
LZG} |
{error, mochi@error:graph_q_l_error()})}.
-opaque op(LZH, LZI) :: {op,
binary(),
gleam@option:option(binary()),
internal_resolver(LZI),
fun((LZI) -> gleam@dynamic:dynamic_()),
list(arg_def()),
mochi@schema:field_type(),
list(fun((mochi@schema:execution_context()) -> {ok, nil} |
{error, binary()})),
LZH}.
-type arg_def() :: {arg_def,
binary(),
mochi@schema:field_type(),
gleam@option:option(binary()),
gleam@option:option(gleam@dynamic:dynamic_())}.
-opaque schema_builder() :: {schema_builder,
list(mochi@schema:field_definition()),
list(mochi@schema:field_definition()),
list(mochi@schema:field_definition()),
list(mochi@schema:object_type()),
list(mochi@schema:enum_type()),
list(mochi@schema:interface_type()),
list(mochi@schema:union_type()),
list(mochi@schema:scalar_type()),
list(mochi@schema:input_object_type()),
boolean()}.
-file("src/mochi/query.gleam", 105).
?DOC(" Override the result encoder. Works on any operation type.\n").
-spec with_encoder(op(LZZ, MAA), fun((MAA) -> gleam@dynamic:dynamic_())) -> op(LZZ, MAA).
with_encoder(Op, Encoder) ->
{op,
erlang:element(2, Op),
erlang:element(3, Op),
erlang:element(4, Op),
Encoder,
erlang:element(6, Op),
erlang:element(7, Op),
erlang:element(8, Op),
erlang:element(9, Op)}.
-file("src/mochi/query.gleam", 110).
?DOC(" Add a guard. Works on any operation type. Guards run in the order added.\n").
-spec with_guard(
op(MAF, MAG),
fun((mochi@schema:execution_context()) -> {ok, nil} | {error, binary()})
) -> op(MAF, MAG).
with_guard(Op, Guard_fn) ->
{op,
erlang:element(2, Op),
erlang:element(3, Op),
erlang:element(4, Op),
erlang:element(5, Op),
erlang:element(6, Op),
erlang:element(7, Op),
lists:append(erlang:element(8, Op), [Guard_fn]),
erlang:element(9, Op)}.
-file("src/mochi/query.gleam", 115).
?DOC(" Set the description. Works on any operation type.\n").
-spec with_description(op(MAL, MAM), binary()) -> op(MAL, MAM).
with_description(Op, Desc) ->
{op,
erlang:element(2, Op),
{some, Desc},
erlang:element(4, Op),
erlang:element(5, Op),
erlang:element(6, Op),
erlang:element(7, Op),
erlang:element(8, Op),
erlang:element(9, Op)}.
-file("src/mochi/query.gleam", 123).
-spec get_name(op(any(), any())) -> binary().
get_name(Op) ->
erlang:element(2, Op).
-file("src/mochi/query.gleam", 127).
-spec get_description(op(any(), any())) -> gleam@option:option(binary()).
get_description(Op) ->
erlang:element(3, Op).
-file("src/mochi/query.gleam", 131).
-spec get_args(op(any(), any())) -> list(arg_def()).
get_args(Op) ->
erlang:element(6, Op).
-file("src/mochi/query.gleam", 140).
?DOC(" Define a query with no arguments.\n").
-spec 'query'(
binary(),
mochi@schema:field_type(),
fun((mochi@schema:execution_context()) -> {ok, MBF} |
{error, mochi@error:graph_q_l_error()})
) -> op(query_kind(), MBF).
'query'(Name, Return_type, Resolver) ->
{op,
Name,
none,
{simple_resolver, fun(_, Ctx) -> Resolver(Ctx) end},
fun gleam_stdlib:identity/1,
[],
Return_type,
[],
query_kind}.
-file("src/mochi/query.gleam", 158).
?DOC(" Define a query with arguments.\n").
-spec query_with_args(
binary(),
list(arg_def()),
mochi@schema:field_type(),
fun((gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), mochi@schema:execution_context()) -> {ok,
MBM} |
{error, mochi@error:graph_q_l_error()})
) -> op(query_kind(), MBM).
query_with_args(Name, Arg_defs, Return_type, Resolver) ->
{op,
Name,
none,
{simple_resolver, Resolver},
fun gleam_stdlib:identity/1,
Arg_defs,
Return_type,
[],
query_kind}.
-file("src/mochi/query.gleam", 181).
-spec mutation(
binary(),
mochi@schema:field_type(),
fun((mochi@schema:execution_context()) -> {ok, MBQ} |
{error, mochi@error:graph_q_l_error()})
) -> op(mutation_kind(), MBQ).
mutation(Name, Return_type, Resolver) ->
{op,
Name,
none,
{simple_resolver, fun(_, Ctx) -> Resolver(Ctx) end},
fun gleam_stdlib:identity/1,
[],
Return_type,
[],
mutation_kind}.
-file("src/mochi/query.gleam", 198).
-spec mutation_with_args(
binary(),
list(arg_def()),
mochi@schema:field_type(),
fun((gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), mochi@schema:execution_context()) -> {ok,
MBX} |
{error, mochi@error:graph_q_l_error()})
) -> op(mutation_kind(), MBX).
mutation_with_args(Name, Arg_defs, Return_type, Resolver) ->
{op,
Name,
none,
{simple_resolver, Resolver},
fun gleam_stdlib:identity/1,
Arg_defs,
Return_type,
[],
mutation_kind}.
-file("src/mochi/query.gleam", 222).
?DOC(" Define a subscription with a static topic string.\n").
-spec subscription(binary(), mochi@schema:field_type(), binary()) -> op(subscription_kind(), any()).
subscription(Name, Return_type, Topic) ->
{op,
Name,
none,
{topic_resolver, fun(_, _) -> {ok, Topic} end},
fun gleam_stdlib:identity/1,
[],
Return_type,
[],
subscription_kind}.
-file("src/mochi/query.gleam", 240).
?DOC(" Define a subscription with arguments and a dynamic topic resolver.\n").
-spec subscription_with_args(
binary(),
list(arg_def()),
mochi@schema:field_type(),
fun((gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), mochi@schema:execution_context()) -> {ok,
binary()} |
{error, mochi@error:graph_q_l_error()})
) -> op(subscription_kind(), any()).
subscription_with_args(Name, Arg_defs, Return_type, Topic_resolver) ->
{op,
Name,
none,
{topic_resolver, Topic_resolver},
fun gleam_stdlib:identity/1,
Arg_defs,
Return_type,
[],
subscription_kind}.
-file("src/mochi/query.gleam", 264).
?DOC(" Define a field on a type with no extra arguments.\n").
-spec field(
binary(),
mochi@schema:field_type(),
fun((gleam@dynamic:dynamic_()) -> {ok, MCK} | {error, binary()}),
fun((MCK, mochi@schema:execution_context()) -> {ok, MCN} |
{error, mochi@error:graph_q_l_error()})
) -> op(field_kind(MCK), MCN).
field(Name, Return_type, Parent_decoder, Resolver) ->
{op,
Name,
none,
{parent_resolver,
fun(Parent_dyn, _, Ctx) ->
gleam@result:'try'(
gleam@option:to_result(
Parent_dyn,
mochi@error:new(<<"No parent value provided"/utf8>>)
),
fun(Parent_dyn_val) ->
gleam@result:'try'(
begin
_pipe = Parent_decoder(Parent_dyn_val),
gleam@result:map_error(
_pipe,
fun(E) ->
mochi@error:new(
<<"Failed to decode parent: "/utf8,
E/binary>>
)
end
)
end,
fun(P) -> Resolver(P, Ctx) end
)
end
)
end},
fun gleam_stdlib:identity/1,
[],
Return_type,
[],
{field_kind, fun(X) -> X end}}.
-file("src/mochi/query.gleam", 295).
?DOC(" Define a field on a type with arguments.\n").
-spec field_with_args(
binary(),
list(arg_def()),
mochi@schema:field_type(),
fun((gleam@dynamic:dynamic_()) -> {ok, MCT} | {error, binary()}),
fun((MCT, gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), mochi@schema:execution_context()) -> {ok,
MCY} |
{error, mochi@error:graph_q_l_error()})
) -> op(field_kind(MCT), MCY).
field_with_args(Name, Arg_defs, Return_type, Parent_decoder, Resolver) ->
{op,
Name,
none,
{parent_resolver,
fun(Parent_dyn, Args, Ctx) ->
gleam@result:'try'(
gleam@option:to_result(
Parent_dyn,
mochi@error:new(<<"No parent value provided"/utf8>>)
),
fun(Parent_dyn_val) ->
gleam@result:'try'(
begin
_pipe = Parent_decoder(Parent_dyn_val),
gleam@result:map_error(
_pipe,
fun(E) ->
mochi@error:new(
<<"Failed to decode parent: "/utf8,
E/binary>>
)
end
)
end,
fun(P) -> Resolver(P, Args, Ctx) end
)
end
)
end},
fun gleam_stdlib:identity/1,
Arg_defs,
Return_type,
[],
{field_kind, fun(X) -> X end}}.
-file("src/mochi/query.gleam", 335).
?DOC(" Combine guards with AND logic — all must pass (checked in list order).\n").
-spec all_of(
list(fun((mochi@schema:execution_context()) -> {ok, nil} | {error, binary()}))
) -> fun((mochi@schema:execution_context()) -> {ok, nil} | {error, binary()}).
all_of(Guard_fns) ->
fun(Ctx) -> gleam@list:try_each(Guard_fns, fun(G) -> G(Ctx) end) end.
-file("src/mochi/query.gleam", 350).
-spec try_any(
list(fun((mochi@schema:execution_context()) -> {ok, nil} | {error, binary()})),
mochi@schema:execution_context(),
binary()
) -> {ok, nil} | {error, binary()}.
try_any(Guards, Ctx, Last_error) ->
case Guards of
[] ->
{error, Last_error};
[G | Rest] ->
case G(Ctx) of
{ok, nil} ->
{ok, nil};
{error, E} ->
try_any(Rest, Ctx, E)
end
end.
-file("src/mochi/query.gleam", 341).
?DOC(
" Combine guards with OR logic — at least one must pass.\n"
" Fails with the last error if all fail.\n"
).
-spec any_of(
list(fun((mochi@schema:execution_context()) -> {ok, nil} | {error, binary()}))
) -> fun((mochi@schema:execution_context()) -> {ok, nil} | {error, binary()}).
any_of(Guard_fns) ->
fun(Ctx) -> case Guard_fns of
[] ->
{error, <<"No guards provided"/utf8>>};
_ ->
try_any(Guard_fns, Ctx, <<"No guards passed"/utf8>>)
end end.
-file("src/mochi/query.gleam", 365).
-spec apply_gql_guards(
list(fun((mochi@schema:execution_context()) -> {ok, nil} | {error, binary()})),
fun((gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), mochi@schema:execution_context()) -> {ok,
MDL} |
{error, mochi@error:graph_q_l_error()})
) -> fun((gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), mochi@schema:execution_context()) -> {ok,
MDL} |
{error, mochi@error:graph_q_l_error()}).
apply_gql_guards(Guards, Resolver) ->
gleam@list:fold(
lists:reverse(Guards),
Resolver,
fun(Inner, G) -> fun(Args, Ctx) -> case G(Ctx) of
{ok, nil} ->
Inner(Args, Ctx);
{error, Msg} ->
{error, mochi@error:new(Msg)}
end end end
).
-file("src/mochi/query.gleam", 380).
-spec apply_topic_guards(
list(fun((mochi@schema:execution_context()) -> {ok, nil} | {error, binary()})),
fun((gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), mochi@schema:execution_context()) -> {ok,
binary()} |
{error, mochi@error:graph_q_l_error()})
) -> fun((gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), mochi@schema:execution_context()) -> {ok,
binary()} |
{error, mochi@error:graph_q_l_error()}).
apply_topic_guards(Guards, Resolver) ->
gleam@list:fold(
lists:reverse(Guards),
Resolver,
fun(Inner, G) -> fun(Args, Ctx) -> case G(Ctx) of
{ok, nil} ->
Inner(Args, Ctx);
{error, Msg} ->
{error, mochi@error:new(Msg)}
end end end
).
-file("src/mochi/query.gleam", 395).
-spec apply_parent_gql_guards(
list(fun((mochi@schema:execution_context()) -> {ok, nil} | {error, binary()})),
fun((gleam@option:option(gleam@dynamic:dynamic_()), gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), mochi@schema:execution_context()) -> {ok,
MEF} |
{error, mochi@error:graph_q_l_error()})
) -> fun((gleam@option:option(gleam@dynamic:dynamic_()), gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), mochi@schema:execution_context()) -> {ok,
MEF} |
{error, mochi@error:graph_q_l_error()}).
apply_parent_gql_guards(Guards, Resolver) ->
gleam@list:fold(
lists:reverse(Guards),
Resolver,
fun(Inner, G) -> fun(Parent, Args, Ctx) -> case G(Ctx) of
{ok, nil} ->
Inner(Parent, Args, Ctx);
{error, Msg} ->
{error, mochi@error:new(Msg)}
end end end
).
-file("src/mochi/query.gleam", 416).
?DOC(" Create an argument definition\n").
-spec arg(binary(), mochi@schema:field_type()) -> arg_def().
arg(Name, Arg_type) ->
{arg_def, Name, Arg_type, none, none}.
-file("src/mochi/query.gleam", 421).
?DOC(" Create an argument with description\n").
-spec arg_with_desc(binary(), mochi@schema:field_type(), binary()) -> arg_def().
arg_with_desc(Name, Arg_type, Description) ->
{arg_def, Name, Arg_type, {some, Description}, none}.
-file("src/mochi/query.gleam", 435).
?DOC(" Create an argument with a default value\n").
-spec arg_with_default(
binary(),
mochi@schema:field_type(),
gleam@dynamic:dynamic_()
) -> arg_def().
arg_with_default(Name, Arg_type, Default) ->
{arg_def, Name, Arg_type, none, {some, Default}}.
-file("src/mochi/query.gleam", 449).
?DOC(" Create an argument with default value and description\n").
-spec arg_with_default_desc(
binary(),
mochi@schema:field_type(),
gleam@dynamic:dynamic_(),
binary()
) -> arg_def().
arg_with_default_desc(Name, Arg_type, Default, Description) ->
{arg_def, Name, Arg_type, {some, Description}, {some, Default}}.
-file("src/mochi/query.gleam", 467).
-spec fetch_required(
gleam@dict:dict(binary(), gleam@dynamic:dynamic_()),
binary(),
gleam@dynamic@decode:decoder(MEP),
binary()
) -> {ok, MEP} | {error, mochi@error:graph_q_l_error()}.
fetch_required(Args, Key, Decoder, Type_label) ->
case gleam_stdlib:map_get(Args, Key) of
{error, _} ->
{error,
mochi@error:new(
<<"Missing required argument: "/utf8, Key/binary>>
)};
{ok, Value} ->
_pipe = gleam@dynamic@decode:run(Value, Decoder),
gleam@result:map_error(
_pipe,
fun(_) ->
mochi@error:new(
<<<<<<"Invalid type for argument '"/utf8, Key/binary>>/binary,
"': expected "/utf8>>/binary,
Type_label/binary>>
)
end
)
end.
-file("src/mochi/query.gleam", 485).
-spec fetch_optional(
gleam@dict:dict(binary(), gleam@dynamic:dynamic_()),
binary(),
gleam@dynamic@decode:decoder(MEV)
) -> gleam@option:option(MEV).
fetch_optional(Args, Key, Decoder) ->
case gleam_stdlib:map_get(Args, Key) of
{error, _} ->
none;
{ok, Value} ->
case gleam@dynamic@decode:run(Value, Decoder) of
{ok, V} ->
{some, V};
{error, _} ->
none
end
end.
-file("src/mochi/query.gleam", 500).
-spec fetch_or(
gleam@dict:dict(binary(), gleam@dynamic:dynamic_()),
binary(),
gleam@dynamic@decode:decoder(MFA),
MFA
) -> MFA.
fetch_or(Args, Key, Decoder, Default) ->
case gleam_stdlib:map_get(Args, Key) of
{error, _} ->
Default;
{ok, Value} ->
gleam@result:unwrap(
gleam@dynamic@decode:run(Value, Decoder),
Default
)
end.
-file("src/mochi/query.gleam", 512).
-spec get_string(gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), binary()) -> {ok,
binary()} |
{error, mochi@error:graph_q_l_error()}.
get_string(Args, Key) ->
fetch_required(
Args,
Key,
{decoder, fun gleam@dynamic@decode:decode_string/1},
<<"String"/utf8>>
).
-file("src/mochi/query.gleam", 519).
-spec get_id(gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), binary()) -> {ok,
binary()} |
{error, mochi@error:graph_q_l_error()}.
get_id(Args, Key) ->
fetch_required(
Args,
Key,
{decoder, fun gleam@dynamic@decode:decode_string/1},
<<"ID"/utf8>>
).
-file("src/mochi/query.gleam", 526).
-spec get_int(gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), binary()) -> {ok,
integer()} |
{error, mochi@error:graph_q_l_error()}.
get_int(Args, Key) ->
fetch_required(
Args,
Key,
{decoder, fun gleam@dynamic@decode:decode_int/1},
<<"Int"/utf8>>
).
-file("src/mochi/query.gleam", 533).
-spec get_float(gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), binary()) -> {ok,
float()} |
{error, mochi@error:graph_q_l_error()}.
get_float(Args, Key) ->
fetch_required(
Args,
Key,
{decoder, fun gleam@dynamic@decode:decode_float/1},
<<"Float"/utf8>>
).
-file("src/mochi/query.gleam", 540).
-spec get_bool(gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), binary()) -> {ok,
boolean()} |
{error, mochi@error:graph_q_l_error()}.
get_bool(Args, Key) ->
fetch_required(
Args,
Key,
{decoder, fun gleam@dynamic@decode:decode_bool/1},
<<"Bool"/utf8>>
).
-file("src/mochi/query.gleam", 547).
-spec get_optional_string(
gleam@dict:dict(binary(), gleam@dynamic:dynamic_()),
binary()
) -> gleam@option:option(binary()).
get_optional_string(Args, Key) ->
fetch_optional(
Args,
Key,
{decoder, fun gleam@dynamic@decode:decode_string/1}
).
-file("src/mochi/query.gleam", 554).
-spec get_optional_id(
gleam@dict:dict(binary(), gleam@dynamic:dynamic_()),
binary()
) -> gleam@option:option(binary()).
get_optional_id(Args, Key) ->
get_optional_string(Args, Key).
-file("src/mochi/query.gleam", 561).
-spec get_optional_int(
gleam@dict:dict(binary(), gleam@dynamic:dynamic_()),
binary()
) -> gleam@option:option(integer()).
get_optional_int(Args, Key) ->
fetch_optional(Args, Key, {decoder, fun gleam@dynamic@decode:decode_int/1}).
-file("src/mochi/query.gleam", 565).
-spec get_optional_float(
gleam@dict:dict(binary(), gleam@dynamic:dynamic_()),
binary()
) -> gleam@option:option(float()).
get_optional_float(Args, Key) ->
fetch_optional(
Args,
Key,
{decoder, fun gleam@dynamic@decode:decode_float/1}
).
-file("src/mochi/query.gleam", 572).
-spec get_optional_bool(
gleam@dict:dict(binary(), gleam@dynamic:dynamic_()),
binary()
) -> gleam@option:option(boolean()).
get_optional_bool(Args, Key) ->
fetch_optional(Args, Key, {decoder, fun gleam@dynamic@decode:decode_bool/1}).
-file("src/mochi/query.gleam", 579).
-spec get_string_list(
gleam@dict:dict(binary(), gleam@dynamic:dynamic_()),
binary()
) -> {ok, list(binary())} | {error, mochi@error:graph_q_l_error()}.
get_string_list(Args, Key) ->
fetch_required(
Args,
Key,
gleam@dynamic@decode:list(
{decoder, fun gleam@dynamic@decode:decode_string/1}
),
<<"[String]"/utf8>>
).
-file("src/mochi/query.gleam", 586).
-spec get_int_list(
gleam@dict:dict(binary(), gleam@dynamic:dynamic_()),
binary()
) -> {ok, list(integer())} | {error, mochi@error:graph_q_l_error()}.
get_int_list(Args, Key) ->
fetch_required(
Args,
Key,
gleam@dynamic@decode:list(
{decoder, fun gleam@dynamic@decode:decode_int/1}
),
<<"[Int]"/utf8>>
).
-file("src/mochi/query.gleam", 593).
-spec decode_input(
gleam@dict:dict(binary(), gleam@dynamic:dynamic_()),
binary(),
gleam@dynamic@decode:decoder(MGX)
) -> {ok, MGX} | {error, mochi@error:graph_q_l_error()}.
decode_input(Args, Key, Decoder) ->
case gleam_stdlib:map_get(Args, Key) of
{error, _} ->
{error,
mochi@error:new(
<<"Missing required argument: "/utf8, Key/binary>>
)};
{ok, Value} ->
_pipe = gleam@dynamic@decode:run(Value, Decoder),
gleam@result:map_error(
_pipe,
fun(_) ->
mochi@error:new(
<<<<"Invalid input for '"/utf8, Key/binary>>/binary,
"'"/utf8>>
)
end
)
end.
-file("src/mochi/query.gleam", 608).
-spec get_dynamic(gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), binary()) -> {ok,
gleam@dynamic:dynamic_()} |
{error, mochi@error:graph_q_l_error()}.
get_dynamic(Args, Key) ->
_pipe = gleam_stdlib:map_get(Args, Key),
gleam@result:map_error(
_pipe,
fun(_) ->
mochi@error:new(<<"Missing required argument: "/utf8, Key/binary>>)
end
).
-file("src/mochi/query.gleam", 616).
-spec get_optional_dynamic(
gleam@dict:dict(binary(), gleam@dynamic:dynamic_()),
binary()
) -> gleam@option:option(gleam@dynamic:dynamic_()).
get_optional_dynamic(Args, Key) ->
_pipe = gleam_stdlib:map_get(Args, Key),
gleam@option:from_result(_pipe).
-file("src/mochi/query.gleam", 624).
-spec get_string_or(
gleam@dict:dict(binary(), gleam@dynamic:dynamic_()),
binary(),
binary()
) -> binary().
get_string_or(Args, Key, Default) ->
fetch_or(
Args,
Key,
{decoder, fun gleam@dynamic@decode:decode_string/1},
Default
).
-file("src/mochi/query.gleam", 632).
-spec get_id_or(
gleam@dict:dict(binary(), gleam@dynamic:dynamic_()),
binary(),
binary()
) -> binary().
get_id_or(Args, Key, Default) ->
get_string_or(Args, Key, Default).
-file("src/mochi/query.gleam", 640).
-spec get_int_or(
gleam@dict:dict(binary(), gleam@dynamic:dynamic_()),
binary(),
integer()
) -> integer().
get_int_or(Args, Key, Default) ->
fetch_or(
Args,
Key,
{decoder, fun gleam@dynamic@decode:decode_int/1},
Default
).
-file("src/mochi/query.gleam", 644).
-spec get_float_or(
gleam@dict:dict(binary(), gleam@dynamic:dynamic_()),
binary(),
float()
) -> float().
get_float_or(Args, Key, Default) ->
fetch_or(
Args,
Key,
{decoder, fun gleam@dynamic@decode:decode_float/1},
Default
).
-file("src/mochi/query.gleam", 652).
-spec get_bool_or(
gleam@dict:dict(binary(), gleam@dynamic:dynamic_()),
binary(),
boolean()
) -> boolean().
get_bool_or(Args, Key, Default) ->
fetch_or(
Args,
Key,
{decoder, fun gleam@dynamic@decode:decode_bool/1},
Default
).
-file("src/mochi/query.gleam", 664).
-spec build_gql_resolver(
fun((gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), mochi@schema:execution_context()) -> {ok,
MHU} |
{error, mochi@error:graph_q_l_error()}),
fun((MHU) -> gleam@dynamic:dynamic_())
) -> fun((mochi@schema:resolver_info()) -> {ok, gleam@dynamic:dynamic_()} |
{error,
{binary(),
gleam@option:option(gleam@dict:dict(binary(), gleam@dynamic:dynamic_()))}}).
build_gql_resolver(Resolver, Result_encoder) ->
fun(Info) ->
case Resolver(erlang:element(3, Info), erlang:element(4, Info)) of
{error, Err} ->
{error, mochi@error:to_payload(Err)};
{ok, Res} ->
{ok, Result_encoder(Res)}
end
end.
-file("src/mochi/query.gleam", 677).
-spec apply_desc(mochi@schema:field_definition(), gleam@option:option(binary())) -> mochi@schema:field_definition().
apply_desc(Field, Desc) ->
case Desc of
{some, D} ->
mochi@schema:field_description(Field, D);
none ->
Field
end.
-file("src/mochi/query.gleam", 729).
-spec add_args_to_field(mochi@schema:field_definition(), list(arg_def())) -> mochi@schema:field_definition().
add_args_to_field(Field, Args) ->
gleam@list:fold(
Args,
Field,
fun(F, A) ->
Base_arg = mochi@schema:arg(
erlang:element(2, A),
erlang:element(3, A)
),
With_desc = case erlang:element(4, A) of
{some, Desc} ->
mochi@schema:arg_description(Base_arg, Desc);
none ->
Base_arg
end,
Arg_def = case erlang:element(5, A) of
{some, Default} ->
mochi@schema:default_value(With_desc, Default);
none ->
With_desc
end,
mochi@schema:argument(F, Arg_def)
end
).
-file("src/mochi/query.gleam", 685).
?DOC(" Convert any Op to a schema FieldDefinition.\n").
-spec to_field_def(op(any(), any())) -> mochi@schema:field_definition().
to_field_def(Op) ->
Base = begin
_pipe = mochi@schema:field_def(
erlang:element(2, Op),
erlang:element(7, Op)
),
_pipe@1 = add_args_to_field(_pipe, erlang:element(6, Op)),
apply_desc(_pipe@1, erlang:element(3, Op))
end,
case erlang:element(4, Op) of
{simple_resolver, Resolver} ->
mochi@schema:rich_resolver_fn(
Base,
build_gql_resolver(
apply_gql_guards(erlang:element(8, Op), Resolver),
erlang:element(5, Op)
)
);
{topic_resolver, Resolver@1} ->
Guarded_topic = apply_topic_guards(
erlang:element(8, Op),
Resolver@1
),
_pipe@2 = Base,
_pipe@3 = mochi@schema:resolver(
_pipe@2,
fun(_) ->
{error,
<<"Subscriptions must be executed through the subscription executor"/utf8>>}
end
),
(fun(Fd) ->
{field_definition,
erlang:element(2, Fd),
erlang:element(3, Fd),
erlang:element(4, Fd),
erlang:element(5, Fd),
erlang:element(6, Fd),
erlang:element(7, Fd),
erlang:element(8, Fd),
{some, fun(Args, Ctx) -> _pipe@4 = Guarded_topic(Args, Ctx),
gleam@result:map_error(
_pipe@4,
fun(E) -> erlang:element(2, E) end
) end},
erlang:element(10, Fd)}
end)(_pipe@3);
{parent_resolver, Resolver@2} ->
Guarded = apply_parent_gql_guards(erlang:element(8, Op), Resolver@2),
mochi@schema:rich_resolver_fn(
Base,
fun(Info) ->
case Guarded(
erlang:element(2, Info),
erlang:element(3, Info),
erlang:element(4, Info)
) of
{error, Err} ->
{error, mochi@error:to_payload(Err)};
{ok, Res} ->
{ok, (erlang:element(5, Op))(Res)}
end
end
)
end.
-file("src/mochi/query.gleam", 769).
-spec new() -> schema_builder().
new() ->
{schema_builder, [], [], [], [], [], [], [], [], [], false}.
-file("src/mochi/query.gleam", 784).
-spec add_query(schema_builder(), op(query_kind(), any())) -> schema_builder().
add_query(Builder, Q) ->
{schema_builder,
[to_field_def(Q) | erlang:element(2, Builder)],
erlang:element(3, Builder),
erlang:element(4, Builder),
erlang:element(5, Builder),
erlang:element(6, Builder),
erlang:element(7, Builder),
erlang:element(8, Builder),
erlang:element(9, Builder),
erlang:element(10, Builder),
erlang:element(11, Builder)}.
-file("src/mochi/query.gleam", 788).
-spec add_mutation(schema_builder(), op(mutation_kind(), any())) -> schema_builder().
add_mutation(Builder, M) ->
{schema_builder,
erlang:element(2, Builder),
[to_field_def(M) | erlang:element(3, Builder)],
erlang:element(4, Builder),
erlang:element(5, Builder),
erlang:element(6, Builder),
erlang:element(7, Builder),
erlang:element(8, Builder),
erlang:element(9, Builder),
erlang:element(10, Builder),
erlang:element(11, Builder)}.
-file("src/mochi/query.gleam", 795).
-spec add_subscription(schema_builder(), op(subscription_kind(), any())) -> schema_builder().
add_subscription(Builder, S) ->
{schema_builder,
erlang:element(2, Builder),
erlang:element(3, Builder),
[to_field_def(S) | erlang:element(4, Builder)],
erlang:element(5, Builder),
erlang:element(6, Builder),
erlang:element(7, Builder),
erlang:element(8, Builder),
erlang:element(9, Builder),
erlang:element(10, Builder),
erlang:element(11, Builder)}.
-file("src/mochi/query.gleam", 805).
-spec add_type(schema_builder(), mochi@schema:object_type()) -> schema_builder().
add_type(Builder, T) ->
{schema_builder,
erlang:element(2, Builder),
erlang:element(3, Builder),
erlang:element(4, Builder),
[T | erlang:element(5, Builder)],
erlang:element(6, Builder),
erlang:element(7, Builder),
erlang:element(8, Builder),
erlang:element(9, Builder),
erlang:element(10, Builder),
erlang:element(11, Builder)}.
-file("src/mochi/query.gleam", 809).
-spec add_enum(schema_builder(), mochi@schema:enum_type()) -> schema_builder().
add_enum(Builder, E) ->
{schema_builder,
erlang:element(2, Builder),
erlang:element(3, Builder),
erlang:element(4, Builder),
erlang:element(5, Builder),
[E | erlang:element(6, Builder)],
erlang:element(7, Builder),
erlang:element(8, Builder),
erlang:element(9, Builder),
erlang:element(10, Builder),
erlang:element(11, Builder)}.
-file("src/mochi/query.gleam", 813).
-spec add_interface(schema_builder(), mochi@schema:interface_type()) -> schema_builder().
add_interface(Builder, I) ->
{schema_builder,
erlang:element(2, Builder),
erlang:element(3, Builder),
erlang:element(4, Builder),
erlang:element(5, Builder),
erlang:element(6, Builder),
[I | erlang:element(7, Builder)],
erlang:element(8, Builder),
erlang:element(9, Builder),
erlang:element(10, Builder),
erlang:element(11, Builder)}.
-file("src/mochi/query.gleam", 820).
-spec add_union(schema_builder(), mochi@schema:union_type()) -> schema_builder().
add_union(Builder, U) ->
{schema_builder,
erlang:element(2, Builder),
erlang:element(3, Builder),
erlang:element(4, Builder),
erlang:element(5, Builder),
erlang:element(6, Builder),
erlang:element(7, Builder),
[U | erlang:element(8, Builder)],
erlang:element(9, Builder),
erlang:element(10, Builder),
erlang:element(11, Builder)}.
-file("src/mochi/query.gleam", 824).
-spec add_scalar(schema_builder(), mochi@schema:scalar_type()) -> schema_builder().
add_scalar(Builder, S) ->
{schema_builder,
erlang:element(2, Builder),
erlang:element(3, Builder),
erlang:element(4, Builder),
erlang:element(5, Builder),
erlang:element(6, Builder),
erlang:element(7, Builder),
erlang:element(8, Builder),
[S | erlang:element(9, Builder)],
erlang:element(10, Builder),
erlang:element(11, Builder)}.
-file("src/mochi/query.gleam", 828).
-spec add_input(schema_builder(), mochi@schema:input_object_type()) -> schema_builder().
add_input(Builder, I) ->
{schema_builder,
erlang:element(2, Builder),
erlang:element(3, Builder),
erlang:element(4, Builder),
erlang:element(5, Builder),
erlang:element(6, Builder),
erlang:element(7, Builder),
erlang:element(8, Builder),
erlang:element(9, Builder),
[I | erlang:element(10, Builder)],
erlang:element(11, Builder)}.
-file("src/mochi/query.gleam", 835).
-spec add_queries(schema_builder(), list(op(query_kind(), any()))) -> schema_builder().
add_queries(Builder, Queries) ->
gleam@list:fold(Queries, Builder, fun(B, Q) -> add_query(B, Q) end).
-file("src/mochi/query.gleam", 842).
-spec add_mutations(schema_builder(), list(op(mutation_kind(), any()))) -> schema_builder().
add_mutations(Builder, Mutations) ->
gleam@list:fold(Mutations, Builder, fun(B, M) -> add_mutation(B, M) end).
-file("src/mochi/query.gleam", 849).
-spec add_subscriptions(schema_builder(), list(op(subscription_kind(), any()))) -> schema_builder().
add_subscriptions(Builder, Subscriptions) ->
gleam@list:fold(
Subscriptions,
Builder,
fun(B, S) -> add_subscription(B, S) end
).
-file("src/mochi/query.gleam", 856).
-spec add_types(schema_builder(), list(mochi@schema:object_type())) -> schema_builder().
add_types(Builder, Types) ->
gleam@list:fold(Types, Builder, fun(B, T) -> add_type(B, T) end).
-file("src/mochi/query.gleam", 863).
-spec add_enums(schema_builder(), list(mochi@schema:enum_type())) -> schema_builder().
add_enums(Builder, Enums) ->
gleam@list:fold(Enums, Builder, fun(B, E) -> add_enum(B, E) end).
-file("src/mochi/query.gleam", 870).
-spec add_interfaces(schema_builder(), list(mochi@schema:interface_type())) -> schema_builder().
add_interfaces(Builder, Interfaces) ->
gleam@list:fold(Interfaces, Builder, fun(B, I) -> add_interface(B, I) end).
-file("src/mochi/query.gleam", 877).
-spec add_unions(schema_builder(), list(mochi@schema:union_type())) -> schema_builder().
add_unions(Builder, Unions) ->
gleam@list:fold(Unions, Builder, fun(B, U) -> add_union(B, U) end).
-file("src/mochi/query.gleam", 884).
-spec add_scalars(schema_builder(), list(mochi@schema:scalar_type())) -> schema_builder().
add_scalars(Builder, Scalars) ->
gleam@list:fold(Scalars, Builder, fun(B, S) -> add_scalar(B, S) end).
-file("src/mochi/query.gleam", 891).
-spec add_inputs(schema_builder(), list(mochi@schema:input_object_type())) -> schema_builder().
add_inputs(Builder, Inputs) ->
gleam@list:fold(Inputs, Builder, fun(B, I) -> add_input(B, I) end).
-file("src/mochi/query.gleam", 899).
?DOC(" Register all built-in custom scalars (DateTime, Date, UUID, Email, URL, JSON).\n").
-spec with_common_scalars(schema_builder()) -> schema_builder().
with_common_scalars(Builder) ->
add_scalars(
Builder,
[mochi@scalars:date_time(),
mochi@scalars:date(),
mochi@scalars:uuid(),
mochi@scalars:email(),
mochi@scalars:url(),
mochi@scalars:json()]
).
-file("src/mochi/query.gleam", 910).
-spec check_duplicates(binary(), list(MJE), list(MJE), fun((MJE) -> binary())) -> nil.
check_duplicates(Label, A_items, B_items, Name_fn) ->
A_names = gleam@list:map(A_items, Name_fn),
Conflicts = gleam@list:filter(
B_items,
fun(Item) -> gleam@list:contains(A_names, Name_fn(Item)) end
),
case Conflicts of
[] ->
nil;
_ ->
erlang:error(#{gleam_error => panic,
message => (<<<<<<"Schema merge conflict: duplicate "/utf8,
Label/binary>>/binary,
" name(s): "/utf8>>/binary,
(gleam@string:join(
gleam@list:map(Conflicts, Name_fn),
<<", "/utf8>>
))/binary>>),
file => <<?FILEPATH/utf8>>,
module => <<"mochi/query"/utf8>>,
function => <<"check_duplicates"/utf8>>,
line => 922})
end.
-file("src/mochi/query.gleam", 931).
-spec merge(schema_builder(), schema_builder()) -> schema_builder().
merge(A, B) ->
check_duplicates(
<<"query"/utf8>>,
erlang:element(2, A),
erlang:element(2, B),
fun(F) -> erlang:element(2, F) end
),
check_duplicates(
<<"mutation"/utf8>>,
erlang:element(3, A),
erlang:element(3, B),
fun(F@1) -> erlang:element(2, F@1) end
),
check_duplicates(
<<"subscription"/utf8>>,
erlang:element(4, A),
erlang:element(4, B),
fun(F@2) -> erlang:element(2, F@2) end
),
check_duplicates(
<<"type"/utf8>>,
erlang:element(5, A),
erlang:element(5, B),
fun(T) -> erlang:element(2, T) end
),
check_duplicates(
<<"enum"/utf8>>,
erlang:element(6, A),
erlang:element(6, B),
fun(E) -> erlang:element(2, E) end
),
check_duplicates(
<<"interface"/utf8>>,
erlang:element(7, A),
erlang:element(7, B),
fun(I) -> erlang:element(2, I) end
),
check_duplicates(
<<"union"/utf8>>,
erlang:element(8, A),
erlang:element(8, B),
fun(U) -> erlang:element(2, U) end
),
check_duplicates(
<<"scalar"/utf8>>,
erlang:element(9, A),
erlang:element(9, B),
fun(S) -> erlang:element(2, S) end
),
check_duplicates(
<<"input"/utf8>>,
erlang:element(10, A),
erlang:element(10, B),
fun(I@1) -> erlang:element(2, I@1) end
),
{schema_builder,
lists:append(erlang:element(2, A), erlang:element(2, B)),
lists:append(erlang:element(3, A), erlang:element(3, B)),
lists:append(erlang:element(4, A), erlang:element(4, B)),
lists:append(erlang:element(5, A), erlang:element(5, B)),
lists:append(erlang:element(6, A), erlang:element(6, B)),
lists:append(erlang:element(7, A), erlang:element(7, B)),
lists:append(erlang:element(8, A), erlang:element(8, B)),
lists:append(erlang:element(9, A), erlang:element(9, B)),
lists:append(erlang:element(10, A), erlang:element(10, B)),
erlang:element(11, A) orelse erlang:element(11, B)}.
-file("src/mochi/query.gleam", 957).
-spec with_cache(schema_builder()) -> schema_builder().
with_cache(Builder) ->
{schema_builder,
erlang:element(2, Builder),
erlang:element(3, Builder),
erlang:element(4, Builder),
erlang:element(5, Builder),
erlang:element(6, Builder),
erlang:element(7, Builder),
erlang:element(8, Builder),
erlang:element(9, Builder),
erlang:element(10, Builder),
true}.
-file("src/mochi/query.gleam", 961).
-spec build(schema_builder()) -> mochi@schema:schema().
build(Builder) ->
Query_type = gleam@list:fold(
erlang:element(2, Builder),
mochi@schema:object(<<"Query"/utf8>>),
fun(Obj, Field) -> mochi@schema:field(Obj, Field) end
),
Base_schema = begin
_pipe = mochi@schema:schema(),
mochi@schema:'query'(_pipe, Query_type)
end,
With_mutation = case erlang:element(3, Builder) of
[] ->
Base_schema;
_ ->
Mutation_type = gleam@list:fold(
erlang:element(3, Builder),
mochi@schema:object(<<"Mutation"/utf8>>),
fun(Obj@1, Field@1) -> mochi@schema:field(Obj@1, Field@1) end
),
mochi@schema:mutation(Base_schema, Mutation_type)
end,
With_subscription = case erlang:element(4, Builder) of
[] ->
With_mutation;
_ ->
Subscription_type = gleam@list:fold(
erlang:element(4, Builder),
mochi@schema:object(<<"Subscription"/utf8>>),
fun(Obj@2, Field@2) -> mochi@schema:field(Obj@2, Field@2) end
),
mochi@schema:subscription(With_mutation, Subscription_type)
end,
With_types = gleam@list:fold(
erlang:element(5, Builder),
With_subscription,
fun(S, T) -> mochi@schema:add_type(S, {object_type_def, T}) end
),
With_enums = gleam@list:fold(
erlang:element(6, Builder),
With_types,
fun(S@1, E) -> mochi@schema:add_type(S@1, {enum_type_def, E}) end
),
With_interfaces = gleam@list:fold(
erlang:element(7, Builder),
With_enums,
fun(S@2, I) -> mochi@schema:add_type(S@2, {interface_type_def, I}) end
),
With_unions = gleam@list:fold(
erlang:element(8, Builder),
With_interfaces,
fun(S@3, U) -> mochi@schema:add_type(S@3, {union_type_def, U}) end
),
With_scalars = gleam@list:fold(
erlang:element(9, Builder),
With_unions,
fun(S@4, Scalar) ->
mochi@schema:add_type(S@4, {scalar_type_def, Scalar})
end
),
With_inputs = gleam@list:fold(
erlang:element(10, Builder),
With_scalars,
fun(S@5, Input) ->
mochi@schema:add_type(S@5, {input_object_type_def, Input})
end
),
With_directives = gleam@list:fold(
mochi@schema:builtin_directives(),
With_inputs,
fun(S@6, Directive) -> mochi@schema:add_directive(S@6, Directive) end
),
{schema,
erlang:element(2, With_directives),
erlang:element(3, With_directives),
erlang:element(4, With_directives),
erlang:element(5, With_directives),
erlang:element(6, With_directives),
{some, mochi@document_cache:new()}}.