Current section

Files

Jump to
caffeine_lang src caffeine_lang@core@compiler.erl
Raw

src/caffeine_lang@core@compiler.erl

-module(caffeine_lang@core@compiler).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/caffeine_lang/core/compiler.gleam").
-export([compile/3, compile_from_strings/3]).
-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/caffeine_lang/core/compiler.gleam", 94).
-spec print_header(
caffeine_lang@core@compilation_configuration:compilation_config()
) -> nil.
print_header(Config) ->
caffeine_lang@core@logger:log(erlang:element(2, Config), <<""/utf8>>),
caffeine_lang@core@logger:log(
erlang:element(2, Config),
gleam_community@ansi:bold(
gleam_community@ansi:cyan(<<"=== CAFFEINE COMPILER ==="/utf8>>)
)
),
caffeine_lang@core@logger:log(erlang:element(2, Config), <<""/utf8>>).
-file("src/caffeine_lang/core/compiler.gleam", 103).
-spec print_step1_start(
caffeine_lang@core@compilation_configuration:compilation_config(),
binary(),
binary()
) -> nil.
print_step1_start(Config, Blueprint_path, Expectations_dir) ->
caffeine_lang@core@logger:log(
erlang:element(2, Config),
gleam_community@ansi:bold(
gleam_community@ansi:underline(<<"[1/3] Parsing and linking"/utf8>>)
)
),
caffeine_lang@core@logger:log(
erlang:element(2, Config),
<<" Blueprint file: "/utf8,
(gleam_community@ansi:dim(Blueprint_path))/binary>>
),
caffeine_lang@core@logger:log(
erlang:element(2, Config),
<<" Expectations directory: "/utf8,
(gleam_community@ansi:dim(Expectations_dir))/binary>>
).
-file("src/caffeine_lang/core/compiler.gleam", 119).
-spec print_step1_success(
caffeine_lang@core@compilation_configuration:compilation_config(),
integer()
) -> nil.
print_step1_success(Config, Count) ->
caffeine_lang@core@logger:log(
erlang:element(2, Config),
<<" "/utf8,
(gleam_community@ansi:green(
<<<<"✓ Parsed "/utf8, (erlang:integer_to_binary(Count))/binary>>/binary,
" expectations"/utf8>>
))/binary>>
).
-file("src/caffeine_lang/core/compiler.gleam", 126).
-spec print_step1_error(
caffeine_lang@core@compilation_configuration:compilation_config()
) -> nil.
print_step1_error(Config) ->
caffeine_lang@core@logger:log(
erlang:element(2, Config),
<<" "/utf8,
(gleam_community@ansi:red(<<"✗ Failed to parse and link"/utf8>>))/binary>>
).
-file("src/caffeine_lang/core/compiler.gleam", 130).
-spec print_step2_start(
caffeine_lang@core@compilation_configuration:compilation_config(),
list(caffeine_lang@middle_end@semantic_analyzer:intermediate_representation())
) -> nil.
print_step2_start(Config, Irs) ->
caffeine_lang@core@logger:log(erlang:element(2, Config), <<""/utf8>>),
caffeine_lang@core@logger:log(
erlang:element(2, Config),
gleam_community@ansi:bold(
gleam_community@ansi:underline(
<<"[2/3] Performing semantic analysis"/utf8>>
)
)
),
caffeine_lang@core@logger:log(
erlang:element(2, Config),
<<<<" Resolving "/utf8,
(gleam_community@ansi:yellow(
erlang:integer_to_binary(erlang:length(Irs))
))/binary>>/binary,
" intermediate representations:"/utf8>>
),
_pipe = Irs,
gleam@list:each(
_pipe,
fun(Ir) ->
caffeine_lang@core@logger:log(
erlang:element(2, Config),
<<<<<<<<<<" "/utf8,
(gleam_community@ansi:dim(<<"•"/utf8>>))/binary>>/binary,
" "/utf8>>/binary,
(erlang:element(3, Ir))/binary>>/binary,
" "/utf8>>/binary,
(gleam_community@ansi:dim(
<<<<"(artifact: "/utf8, (erlang:element(4, Ir))/binary>>/binary,
")"/utf8>>
))/binary>>
)
end
).
-file("src/caffeine_lang/core/compiler.gleam", 159).
-spec print_step2_success(
caffeine_lang@core@compilation_configuration:compilation_config(),
integer()
) -> nil.
print_step2_success(Config, Count) ->
caffeine_lang@core@logger:log(
erlang:element(2, Config),
<<" "/utf8,
(gleam_community@ansi:green(
<<<<"✓ Resolved vendors and queries for "/utf8,
(erlang:integer_to_binary(Count))/binary>>/binary,
" expectations"/utf8>>
))/binary>>
).
-file("src/caffeine_lang/core/compiler.gleam", 171).
-spec print_step2_error(
caffeine_lang@core@compilation_configuration:compilation_config()
) -> nil.
print_step2_error(Config) ->
caffeine_lang@core@logger:log(
erlang:element(2, Config),
<<" "/utf8,
(gleam_community@ansi:red(<<"✗ Semantic analysis failed"/utf8>>))/binary>>
).
-file("src/caffeine_lang/core/compiler.gleam", 175).
-spec print_step3_start(
caffeine_lang@core@compilation_configuration:compilation_config(),
list(caffeine_lang@middle_end@semantic_analyzer:intermediate_representation())
) -> nil.
print_step3_start(Config, Irs) ->
caffeine_lang@core@logger:log(erlang:element(2, Config), <<""/utf8>>),
caffeine_lang@core@logger:log(
erlang:element(2, Config),
gleam_community@ansi:bold(
gleam_community@ansi:underline(
<<"[3/3] Generating Terraform artifacts"/utf8>>
)
)
),
caffeine_lang@core@logger:log(
erlang:element(2, Config),
<<<<" Generating resources for "/utf8,
(gleam_community@ansi:yellow(
erlang:integer_to_binary(erlang:length(Irs))
))/binary>>/binary,
" expectations:"/utf8>>
),
_pipe = Irs,
gleam@list:each(
_pipe,
fun(Ir) ->
caffeine_lang@core@logger:log(
erlang:element(2, Config),
<<<<<<<<<<" "/utf8,
(gleam_community@ansi:dim(<<"•"/utf8>>))/binary>>/binary,
" "/utf8>>/binary,
(erlang:element(2, erlang:element(2, Ir)))/binary>>/binary,
" "/utf8>>/binary,
(gleam_community@ansi:dim(
<<<<<<<<<<<<"(org: "/utf8,
(erlang:element(
3,
erlang:element(2, Ir)
))/binary>>/binary,
", team: "/utf8>>/binary,
(erlang:element(
6,
erlang:element(2, Ir)
))/binary>>/binary,
", service: "/utf8>>/binary,
(erlang:element(4, erlang:element(2, Ir)))/binary>>/binary,
")"/utf8>>
))/binary>>
)
end
).
-file("src/caffeine_lang/core/compiler.gleam", 212).
-spec print_step3_success(
caffeine_lang@core@compilation_configuration:compilation_config()
) -> nil.
print_step3_success(Config) ->
caffeine_lang@core@logger:log(
erlang:element(2, Config),
<<" "/utf8,
(gleam_community@ansi:green(
<<"✓ Generated Terraform configuration"/utf8>>
))/binary>>
).
-file("src/caffeine_lang/core/compiler.gleam", 219).
-spec print_step3_error(
caffeine_lang@core@compilation_configuration:compilation_config()
) -> nil.
print_step3_error(Config) ->
caffeine_lang@core@logger:log(
erlang:element(2, Config),
<<" "/utf8,
(gleam_community@ansi:red(<<"✗ Code generation failed"/utf8>>))/binary>>
).
-file("src/caffeine_lang/core/compiler.gleam", 223).
-spec print_footer(
caffeine_lang@core@compilation_configuration:compilation_config()
) -> nil.
print_footer(Config) ->
caffeine_lang@core@logger:log(erlang:element(2, Config), <<""/utf8>>),
caffeine_lang@core@logger:log(
erlang:element(2, Config),
gleam_community@ansi:bold(
gleam_community@ansi:green(<<"=== COMPILATION COMPLETE ==="/utf8>>)
)
),
caffeine_lang@core@logger:log(erlang:element(2, Config), <<""/utf8>>).
-file("src/caffeine_lang/core/compiler.gleam", 234).
-spec run_parse_and_link(binary(), binary()) -> {ok,
list(caffeine_lang@middle_end@semantic_analyzer:intermediate_representation())} |
{error, caffeine_lang@common@errors:compilation_error()}.
run_parse_and_link(Blueprint_file_path, Expectations_directory) ->
caffeine_lang@parser@linker:link(
Blueprint_file_path,
Expectations_directory
).
-file("src/caffeine_lang/core/compiler.gleam", 241).
-spec run_semantic_analysis(
list(caffeine_lang@middle_end@semantic_analyzer:intermediate_representation())
) -> {ok,
list(caffeine_lang@middle_end@semantic_analyzer:intermediate_representation())} |
{error, caffeine_lang@common@errors:compilation_error()}.
run_semantic_analysis(Irs) ->
caffeine_lang@middle_end@semantic_analyzer:resolve_intermediate_representations(
Irs
).
-file("src/caffeine_lang/core/compiler.gleam", 247).
-spec run_code_generation(
list(caffeine_lang@middle_end@semantic_analyzer:intermediate_representation())
) -> {ok, binary()} | {error, caffeine_lang@common@errors:compilation_error()}.
run_code_generation(Resolved_irs) ->
caffeine_lang@generator@datadog:generate_terraform(Resolved_irs).
-file("src/caffeine_lang/core/compiler.gleam", 19).
?DOC(" Compiles a blueprint and expectations directory into Terraform configuration.\n").
-spec compile(
binary(),
binary(),
caffeine_lang@core@compilation_configuration:compilation_config()
) -> {ok, binary()} | {error, caffeine_lang@common@errors:compilation_error()}.
compile(Blueprint_file_path, Expectations_directory, Config) ->
print_header(Config),
print_step1_start(Config, Blueprint_file_path, Expectations_directory),
gleam@result:'try'(
case run_parse_and_link(Blueprint_file_path, Expectations_directory) of
{error, Err} ->
print_step1_error(Config),
{error, Err};
{ok, Irs} ->
print_step1_success(Config, erlang:length(Irs)),
{ok, Irs}
end,
fun(Irs@1) ->
print_step2_start(Config, Irs@1),
gleam@result:'try'(case run_semantic_analysis(Irs@1) of
{error, Err@1} ->
print_step2_error(Config),
{error, Err@1};
{ok, Resolved_irs} ->
print_step2_success(Config, erlang:length(Resolved_irs)),
{ok, Resolved_irs}
end, fun(Resolved_irs@1) ->
print_step3_start(Config, Resolved_irs@1),
gleam@result:'try'(
case run_code_generation(Resolved_irs@1) of
{error, Err@2} ->
print_step3_error(Config),
{error, Err@2};
{ok, Output} ->
print_step3_success(Config),
{ok, Output}
end,
fun(Terraform_output) ->
print_footer(Config),
{ok, Terraform_output}
end
)
end)
end
).
-file("src/caffeine_lang/core/compiler.gleam", 253).
-spec parse_from_strings(binary(), binary(), binary()) -> {ok,
list(caffeine_lang@middle_end@semantic_analyzer:intermediate_representation())} |
{error, caffeine_lang@common@errors:compilation_error()}.
parse_from_strings(Blueprints_json, Expectations_json, Expectations_path) ->
gleam@result:'try'(
caffeine_lang@parser@artifacts:parse_standard_library(),
fun(Artifacts) ->
gleam@result:'try'(
caffeine_lang@parser@blueprints:parse_from_json_string(
Blueprints_json,
Artifacts
),
fun(Validated_blueprints) ->
gleam@result:'try'(
caffeine_lang@parser@expectations:parse_from_json_string(
Expectations_json,
Validated_blueprints
),
fun(Expectations_blueprint_collection) ->
{ok,
caffeine_lang@parser@ir_builder:build_all(
[{Expectations_blueprint_collection,
Expectations_path}]
)}
end
)
end
)
end
).
-file("src/caffeine_lang/core/compiler.gleam", 73).
?DOC(
" Compiles from JSON strings directly (no file I/O).\n"
" Used for browser-based compilation.\n"
).
-spec compile_from_strings(binary(), binary(), binary()) -> {ok, binary()} |
{error, caffeine_lang@common@errors:compilation_error()}.
compile_from_strings(Blueprints_json, Expectations_json, Expectations_path) ->
gleam@result:'try'(
parse_from_strings(
Blueprints_json,
Expectations_json,
Expectations_path
),
fun(Irs) ->
gleam@result:'try'(
run_semantic_analysis(Irs),
fun(Resolved_irs) -> run_code_generation(Resolved_irs) end
)
end
).