Current section

Files

Jump to
caffeine_lang src caffeine_query_language@resolver.erl
Raw

src/caffeine_query_language@resolver.erl

-module(caffeine_query_language@resolver).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/caffeine_query_language/resolver.gleam").
-export([comparator_to_string/1, resolve_primitives/1]).
-export_type([primitives/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 primitives() :: {good_over_total,
caffeine_query_language@ast:exp(),
caffeine_query_language@ast:exp()} |
{time_slice,
caffeine_query_language@ast:comparator(),
integer(),
float(),
binary()}.
-file("src/caffeine_query_language/resolver.gleam", 23).
?DOC(false).
-spec comparator_to_string(caffeine_query_language@ast:comparator()) -> binary().
comparator_to_string(Comparator) ->
case Comparator of
less_than ->
<<"\"<\""/utf8>>;
less_than_or_equal_to ->
<<"\"<=\""/utf8>>;
greater_than ->
<<"\">\""/utf8>>;
greater_than_or_equal_to ->
<<"\">=\""/utf8>>
end.
-file("src/caffeine_query_language/resolver.gleam", 65).
?DOC(" Checks if an expression contains a time_slice expression anywhere.\n").
-spec contains_time_slice(caffeine_query_language@ast:exp()) -> boolean().
contains_time_slice(Exp) ->
case Exp of
{time_slice_expr, _} ->
true;
{operator_expr, Left, Right, _} ->
contains_time_slice(Left) orelse contains_time_slice(Right);
{primary, {primary_exp, Inner}} ->
contains_time_slice(Inner);
{primary, {primary_word, _}} ->
false
end.
-file("src/caffeine_query_language/resolver.gleam", 36).
?DOC(false).
-spec resolve_primitives(caffeine_query_language@ast:exp()) -> {ok,
primitives()} |
{error, caffeine_lang@errors:compilation_error()}.
resolve_primitives(Exp) ->
case Exp of
{operator_expr, Left, Right, 'div'} ->
gleam@bool:guard(
contains_time_slice(Left) orelse contains_time_slice(Right),
{error,
{c_q_l_resolver_error,
<<"time_slice cannot be used as an operand. It must be the entire expression."/utf8>>,
caffeine_lang@errors:empty_context()}},
fun() -> {ok, {good_over_total, Left, Right}} end
);
{time_slice_expr, Spec} ->
{ok,
{time_slice,
erlang:element(3, Spec),
erlang:trunc(erlang:element(5, Spec)),
erlang:element(4, Spec),
erlang:element(2, Spec)}};
_ ->
{error,
{c_q_l_resolver_error,
<<"Invalid expression. Expected a top level division operator or time_slice."/utf8>>,
caffeine_lang@errors:empty_context()}}
end.