Packages

Primitives for emitting and linting Datadog query syntax.

Current section

Files

Jump to
datadog_query src datadog_query@ast.erl
Raw

src/datadog_query@ast.erl

-module(datadog_query@ast).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/datadog_query/ast.gleam").
-export([comparison_op_to_string/1, to_string/1]).
-export_type([comparison_op/0, filter/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 comparison_op() :: gt | gte | lt | lte.
-type filter() :: {tag, binary(), binary()} |
{negated_tag, binary(), binary()} |
{tag_comparison, binary(), comparison_op(), binary()} |
{tag_regex, binary(), binary()} |
{tag_in, binary(), list(binary())} |
{tag_not_in, binary(), list(binary())} |
{'and', list(filter())} |
{'or', list(filter())} |
{'not', filter()} |
wildcard.
-file("src/datadog_query/ast.gleam", 78).
-spec precedence_not() -> integer().
precedence_not() ->
3.
-file("src/datadog_query/ast.gleam", 74).
-spec precedence_and() -> integer().
precedence_and() ->
2.
-file("src/datadog_query/ast.gleam", 70).
?DOC(
" Precedence levels used to decide when to parenthesize a child during\n"
" rendering. Higher = binds tighter. The numbers themselves don't matter\n"
" — only relative ordering.\n"
).
-spec precedence_or() -> integer().
precedence_or() ->
1.
-file("src/datadog_query/ast.gleam", 82).
-spec precedence_of(filter()) -> integer().
precedence_of(Filter) ->
case Filter of
{'or', _} ->
precedence_or();
{'and', _} ->
precedence_and();
{'not', _} ->
precedence_not();
_ ->
4
end.
-file("src/datadog_query/ast.gleam", 58).
-spec comparison_op_to_string(comparison_op()) -> binary().
comparison_op_to_string(Op) ->
case Op of
gt ->
<<">"/utf8>>;
gte ->
<<">="/utf8>>;
lt ->
<<"<"/utf8>>;
lte ->
<<"<="/utf8>>
end.
-file("src/datadog_query/ast.gleam", 97).
-spec render_with_parens(filter(), integer()) -> binary().
render_with_parens(Filter, Parent_prec) ->
case precedence_of(Filter) < Parent_prec of
true ->
<<<<"("/utf8, (to_string(Filter))/binary>>/binary, ")"/utf8>>;
false ->
to_string(Filter)
end.
-file("src/datadog_query/ast.gleam", 91).
-spec render_binary(list(filter()), binary(), integer()) -> binary().
render_binary(Filters, Sep, Parent_prec) ->
_pipe = Filters,
_pipe@1 = gleam@list:map(
_pipe,
fun(F) -> render_with_parens(F, Parent_prec) end
),
gleam@string:join(_pipe@1, Sep).
-file("src/datadog_query/ast.gleam", 34).
-spec to_string(filter()) -> binary().
to_string(Filter) ->
case Filter of
{tag, Name, Value} ->
<<<<Name/binary, ":"/utf8>>/binary,
(datadog_query@quote:value(Value))/binary>>;
{negated_tag, Name@1, Value@1} ->
<<<<<<"!"/utf8, Name@1/binary>>/binary, ":"/utf8>>/binary,
(datadog_query@quote:value(Value@1))/binary>>;
{tag_comparison, Name@2, Op, Value@2} ->
<<<<<<Name@2/binary, ":"/utf8>>/binary,
(comparison_op_to_string(Op))/binary>>/binary,
Value@2/binary>>;
{tag_regex, Name@3, Pattern} ->
<<<<Name@3/binary, ":~"/utf8>>/binary,
(datadog_query@quote:value(Pattern))/binary>>;
{tag_in, Name@4, Values} ->
<<<<<<Name@4/binary, " IN ("/utf8>>/binary,
(begin
_pipe = Values,
_pipe@1 = gleam@list:map(
_pipe,
fun datadog_query@quote:value/1
),
gleam@string:join(_pipe@1, <<", "/utf8>>)
end)/binary>>/binary,
")"/utf8>>;
{tag_not_in, Name@5, Values@1} ->
<<<<<<Name@5/binary, " NOT IN ("/utf8>>/binary,
(begin
_pipe@2 = Values@1,
_pipe@3 = gleam@list:map(
_pipe@2,
fun datadog_query@quote:value/1
),
gleam@string:join(_pipe@3, <<", "/utf8>>)
end)/binary>>/binary,
")"/utf8>>;
{'and', Filters} ->
render_binary(Filters, <<" AND "/utf8>>, precedence_and());
{'or', Filters@1} ->
render_binary(Filters@1, <<" OR "/utf8>>, precedence_or());
{'not', Inner} ->
<<"NOT "/utf8,
(render_with_parens(Inner, precedence_not()))/binary>>;
wildcard ->
<<"*"/utf8>>
end.