-module(datadog_query@filter). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/datadog_query/filter.gleam"). -export([tag/2, negated_tag/2, tag_in/2, tag_not_in/2, tag_gt/2, tag_gte/2, tag_lt/2, tag_lte/2, tag_gt_int/2, tag_gte_int/2, tag_lt_int/2, tag_lte_int/2, tag_regex/2, all_of/1, any_of/1, group/1, not_/1]). -if(?OTP_RELEASE >= 27). -define(MODULEDOC(Str), -moduledoc(Str)). -define(DOC(Str), -doc(Str)). -else. -define(MODULEDOC(Str), -compile([])). -define(DOC(Str), -compile([])). -endif. -file("src/datadog_query/filter.gleam", 17). ?DOC(" `name:value` — wildcards in `value` are preserved.\n"). -spec tag(binary(), binary()) -> binary(). tag(Name, Value) -> <<<>/binary, (datadog_query@quote:value(Value))/binary>>. -file("src/datadog_query/filter.gleam", 22). ?DOC(" `!name:value` — negated tag filter.\n"). -spec negated_tag(binary(), binary()) -> binary(). negated_tag(Name, Value) -> <<<<<<"!"/utf8, Name/binary>>/binary, ":"/utf8>>/binary, (datadog_query@quote:value(Value))/binary>>. -file("src/datadog_query/filter.gleam", 27). ?DOC(" `name IN (v1, v2, ...)` — empty list returns \"\".\n"). -spec tag_in(binary(), list(binary())) -> binary(). tag_in(Name, Values) -> case Values of [] -> <<""/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>> end. -file("src/datadog_query/filter.gleam", 39). ?DOC(" `name NOT IN (v1, v2, ...)` — empty list returns \"\".\n"). -spec tag_not_in(binary(), list(binary())) -> binary(). tag_not_in(Name, Values) -> case Values of [] -> <<""/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>> end. -file("src/datadog_query/filter.gleam", 74). ?DOC( " Datadog rejects scientific notation in thresholds, but `float.to_string`\n" " emits `1.0e3` for whole values. Render whole numbers as `N.0`, fall back\n" " to `float.to_string` for fractional values.\n" ). -spec format_float(float()) -> binary(). format_float(F) -> Truncated = erlang:trunc(F), case erlang:float(Truncated) =:= F of true -> <<(erlang:integer_to_binary(Truncated))/binary, ".0"/utf8>>; false -> gleam_stdlib:float_to_string(F) end. -file("src/datadog_query/filter.gleam", 52). ?DOC( " `name:>value` — numeric greater-than. Value rendered without quoting\n" " since comparisons are only meaningful on numbers/durations.\n" ). -spec tag_gt(binary(), float()) -> binary(). tag_gt(Name, Value) -> <<<"/utf8>>/binary, (format_float(Value))/binary>>. -file("src/datadog_query/filter.gleam", 57). ?DOC(" `name:>=value`.\n"). -spec tag_gte(binary(), float()) -> binary(). tag_gte(Name, Value) -> <<<="/utf8>>/binary, (format_float(Value))/binary>>. -file("src/datadog_query/filter.gleam", 62). ?DOC(" `name: binary(). tag_lt(Name, Value) -> <<<>/binary, (format_float(Value))/binary>>. -file("src/datadog_query/filter.gleam", 67). ?DOC(" `name:<=value`.\n"). -spec tag_lte(binary(), float()) -> binary(). tag_lte(Name, Value) -> <<<=500`).\n" ). -spec tag_gt_int(binary(), integer()) -> binary(). tag_gt_int(Name, Value) -> <<<"/utf8>>/binary, (erlang:integer_to_binary(Value))/binary>>. -file("src/datadog_query/filter.gleam", 88). -spec tag_gte_int(binary(), integer()) -> binary(). tag_gte_int(Name, Value) -> <<<="/utf8>>/binary, (erlang:integer_to_binary(Value))/binary>>. -file("src/datadog_query/filter.gleam", 92). -spec tag_lt_int(binary(), integer()) -> binary(). tag_lt_int(Name, Value) -> <<<>/binary, (erlang:integer_to_binary(Value))/binary>>. -file("src/datadog_query/filter.gleam", 96). -spec tag_lte_int(binary(), integer()) -> binary(). tag_lte_int(Name, Value) -> <<< binary(). tag_regex(Name, Pattern) -> <<<>/binary, (datadog_query@quote:value(Pattern))/binary>>. -file("src/datadog_query/filter.gleam", 109). ?DOC( " Joins sub-filters with ` AND `. Empty-string fragments are dropped so\n" " composing with `tag_in([])` doesn't leave a dangling joiner.\n" " Empty list (or all-empty list) returns \"\".\n" ). -spec all_of(list(binary())) -> binary(). all_of(Filters) -> _pipe = Filters, _pipe@1 = gleam@list:filter(_pipe, fun(F) -> F /= <<""/utf8>> end), gleam@string:join(_pipe@1, <<" AND "/utf8>>). -file("src/datadog_query/filter.gleam", 114). ?DOC(" Joins sub-filters with ` OR `. See `all_of` for empty-fragment handling.\n"). -spec any_of(list(binary())) -> binary(). any_of(Filters) -> _pipe = Filters, _pipe@1 = gleam@list:filter(_pipe, fun(F) -> F /= <<""/utf8>> end), gleam@string:join(_pipe@1, <<" OR "/utf8>>). -file("src/datadog_query/filter.gleam", 130). ?DOC(" Wraps a sub-filter in parens. Empty input returns \"\" (no `()`).\n"). -spec group(binary()) -> binary(). group(Filter) -> case Filter of <<""/utf8>> -> <<""/utf8>>; _ -> <<<<"("/utf8, Filter/binary>>/binary, ")"/utf8>> end. -file("src/datadog_query/filter.gleam", 122). ?DOC( " `NOT ` — boolean negation of a sub-expression.\n" " Differs from `negated_tag`: that emits `!key:value` (negation of a\n" " SimpleFilter token); this emits `NOT (...)` over arbitrary sub-filters.\n" " Empty input returns \"\".\n" ). -spec not_(binary()) -> binary(). not_(Filter) -> case Filter of <<""/utf8>> -> <<""/utf8>>; _ -> <<"NOT "/utf8, (group(Filter))/binary>> end.