-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} -> <<<>/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} -> <<<<<>/binary, (comparison_op_to_string(Op))/binary>>/binary, Value@2/binary>>; {tag_regex, Name@3, Pattern} -> <<<>/binary, (datadog_query@quote:value(Pattern))/binary>>; {tag_in, Name@4, Values} -> <<<<<>/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} -> <<<<<>/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.