Current section

Files

Jump to
caffeine_lang src caffeine_lang@middle_end@templatizer.erl
Raw

src/caffeine_lang@middle_end@templatizer.erl

-module(caffeine_lang@middle_end@templatizer).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/caffeine_lang/middle_end/templatizer.gleam").
-export([parse_template_type/1, resolve_string_value/2, resolve_list_value/2, resolve_template/2, parse_template_variable/1, parse_and_resolve_query_template/2]).
-export_type([template_variable/0, datadog_template_type/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 template_variable() :: {template_variable,
binary(),
binary(),
datadog_template_type()}.
-type datadog_template_type() :: raw | default | 'not'.
-file("src/caffeine_lang/middle_end/templatizer.gleam", 178).
?DOC(false).
-spec parse_template_type(binary()) -> {ok, datadog_template_type()} |
{error, caffeine_lang@common@errors:compilation_error()}.
parse_template_type(Type_string) ->
case Type_string of
<<"not"/utf8>> ->
{ok, 'not'};
_ ->
{error,
{semantic_analysis_template_parse_error,
<<"Unknown template type: "/utf8, Type_string/binary>>}}
end.
-file("src/caffeine_lang/middle_end/templatizer.gleam", 229).
?DOC(false).
-spec resolve_string_value(template_variable(), binary()) -> binary().
resolve_string_value(Template, Value) ->
Attr = erlang:element(3, Template),
case erlang:element(4, Template) of
raw ->
Value;
default ->
<<<<Attr/binary, ":"/utf8>>/binary, Value/binary>>;
'not' ->
<<<<<<"!"/utf8, Attr/binary>>/binary, ":"/utf8>>/binary,
Value/binary>>
end.
-file("src/caffeine_lang/middle_end/templatizer.gleam", 243).
?DOC(false).
-spec resolve_list_value(template_variable(), list(binary())) -> binary().
resolve_list_value(Template, Values) ->
Attr = erlang:element(3, Template),
case {erlang:element(4, Template), Values} of
{_, []} ->
<<""/utf8>>;
{raw, Values@1} ->
_pipe = Values@1,
gleam@string:join(_pipe, <<", "/utf8>>);
{default, Values@2} ->
<<<<<<Attr/binary, " IN ("/utf8>>/binary,
(begin
_pipe@1 = Values@2,
gleam@string:join(_pipe@1, <<", "/utf8>>)
end)/binary>>/binary,
")"/utf8>>;
{'not', Values@3} ->
<<<<<<Attr/binary, " NOT IN ("/utf8>>/binary,
(begin
_pipe@2 = Values@3,
gleam@string:join(_pipe@2, <<", "/utf8>>)
end)/binary>>/binary,
")"/utf8>>
end.
-file("src/caffeine_lang/middle_end/templatizer.gleam", 193).
?DOC(false).
-spec resolve_template(
template_variable(),
caffeine_lang@common@helpers:value_tuple()
) -> {ok, binary()} | {error, caffeine_lang@common@errors:compilation_error()}.
resolve_template(Template, Value_tuple) ->
gleam@result:'try'(
case erlang:element(2, Template) =:= erlang:element(2, Value_tuple) of
true ->
{ok, true};
_ ->
{error,
{semantic_analysis_template_resolution_error,
<<<<<<<<"Mismatch between template input name ("/utf8,
(erlang:element(2, Template))/binary>>/binary,
") and input value label ("/utf8>>/binary,
(erlang:element(2, Value_tuple))/binary>>/binary,
")."/utf8>>}}
end,
fun(_) ->
case caffeine_lang@common@accepted_types:resolve_to_string(
erlang:element(3, Value_tuple),
erlang:element(4, Value_tuple),
fun(_capture) -> resolve_string_value(Template, _capture) end,
fun(_capture@1) -> resolve_list_value(Template, _capture@1) end
) of
{ok, Resolved} ->
{ok, Resolved};
{error, Msg} ->
{error, {semantic_analysis_template_resolution_error, Msg}}
end
end
).
-file("src/caffeine_lang/middle_end/templatizer.gleam", 257).
?DOC(" Helper to parse Datadog format template variables (with ->).\n").
-spec parse_datadog_template_variable(binary(), binary()) -> {ok,
template_variable()} |
{error, caffeine_lang@common@errors:compilation_error()}.
parse_datadog_template_variable(Input_name, Rest) ->
case gleam@string:split_once(Rest, <<":"/utf8>>) of
{error, _} ->
{ok,
{template_variable,
gleam@string:trim(Rest),
Input_name,
default}};
{ok, {Datadog_attr, Type_string}} ->
case parse_template_type(gleam@string:trim(Type_string)) of
{error, E} ->
{error, E};
{ok, Template_type} ->
{ok,
{template_variable,
gleam@string:trim(Datadog_attr),
Input_name,
Template_type}}
end
end.
-file("src/caffeine_lang/middle_end/templatizer.gleam", 134).
?DOC(false).
-spec parse_template_variable(binary()) -> {ok, template_variable()} |
{error, caffeine_lang@common@errors:compilation_error()}.
parse_template_variable(Variable) ->
case gleam@string:split_once(Variable, <<"->"/utf8>>) of
{error, _} ->
Trimmed = gleam@string:trim(Variable),
case Trimmed of
<<""/utf8>> ->
{error,
{semantic_analysis_template_parse_error,
<<"Empty template variable name: "/utf8,
Variable/binary>>}};
_ ->
{ok, {template_variable, Trimmed, <<""/utf8>>, raw}}
end;
{ok, {Input_name, Rest}} ->
Trimmed_input = gleam@string:trim(Input_name),
case {Trimmed_input, Rest} of
{<<""/utf8>>, _} ->
{error,
{semantic_analysis_template_parse_error,
<<"Empty input name in template: "/utf8,
Variable/binary>>}};
{_, <<""/utf8>>} ->
{error,
{semantic_analysis_template_parse_error,
<<"Empty label name in template: "/utf8,
Variable/binary>>}};
{_, _} ->
parse_datadog_template_variable(Trimmed_input, Rest)
end
end.
-file("src/caffeine_lang/middle_end/templatizer.gleam", 78).
?DOC(false).
-spec parse_and_resolve_query_template(
binary(),
list(caffeine_lang@common@helpers:value_tuple())
) -> {ok, binary()} | {error, caffeine_lang@common@errors:compilation_error()}.
parse_and_resolve_query_template(Query, Value_tuples) ->
case gleam@string:split_once(Query, <<"$$"/utf8>>) of
{error, _} ->
{ok, Query};
{ok, {Before, Rest}} ->
case gleam@string:split_once(Rest, <<"$$"/utf8>>) of
{error, _} ->
{error,
{semantic_analysis_template_parse_error,
<<"Unexpected incomplete `$$` for substring: "/utf8,
Query/binary>>}};
{ok, {Inside, Rest@1}} ->
gleam@result:'try'(
parse_and_resolve_query_template(Rest@1, Value_tuples),
fun(Rest_of_items) ->
gleam@result:'try'(
parse_template_variable(Inside),
fun(Template) ->
gleam@result:'try'(
case begin
_pipe = Value_tuples,
_pipe@1 = gleam@list:filter(
_pipe,
fun(Vt) ->
erlang:element(2, Vt) =:= erlang:element(
2,
Template
)
end
),
gleam@list:first(_pipe@1)
end of
{error, _} ->
{error,
{semantic_analysis_template_parse_error,
<<"Missing input for template: "/utf8,
(erlang:element(
2,
Template
))/binary>>}};
{ok, Value_tuple} ->
{ok, Value_tuple}
end,
fun(Value_tuple@1) ->
gleam@result:'try'(
resolve_template(
Template,
Value_tuple@1
),
fun(Resolved_template) ->
{ok,
<<<<Before/binary,
Resolved_template/binary>>/binary,
Rest_of_items/binary>>}
end
)
end
)
end
)
end
)
end
end.