Packages
caffeine_lang
6.1.2
6.3.1
6.3.0
6.2.2
6.2.1
6.2.0
6.1.2
6.1.1
6.1.0
6.0.0
5.6.0
5.5.0
5.4.4
5.4.3
5.4.2
5.4.1
5.4.0
5.3.0
5.2.0
5.1.1
5.1.0
5.0.12
5.0.11
5.0.10
5.0.8
5.0.7
5.0.6
5.0.5
5.0.4
5.0.1
5.0.0
4.10.0
4.9.0
4.8.3
4.8.2
4.8.1
4.8.0
4.7.9
4.7.8
4.7.7
4.7.6
4.7.5
4.6.7
4.6.6
4.6.5
4.6.4
4.6.3
4.6.2
4.6.0
4.5.1
4.5.0
4.4.4
4.4.3
4.4.1
4.4.0
4.3.7
4.3.6
3.0.6
3.0.5
3.0.4
3.0.3
3.0.2
3.0.1
3.0.0
2.0.5
2.0.4
2.0.3
2.0.2
2.0.1
2.0.0
1.0.2
1.0.1
0.1.0
0.0.24
0.0.23
0.0.22
0.0.21
0.0.20
0.0.19
0.0.18
0.0.17
0.0.16
0.0.15
0.0.14
0.0.13
0.0.12
0.0.11
0.0.10
0.0.9
0.0.8
0.0.7
0.0.6
0.0.5
0.0.4
0.0.2
0.0.1
A compiler for generating reliability artifacts from service expectation definitions.
Current section
Files
Jump to
Current section
Files
src/caffeine_lang/codegen/generator_utils.gleam
import caffeine_lang/errors.{type CompilationError}
import caffeine_lang/linker/ir.{type IntermediateRepresentationMetaData}
import gleam/option
import terra_madre/render
import terra_madre/terraform.{
type Provider, type Resource, type TerraformSettings, type Variable,
}
/// Drop the last `n` UTF-16 codeunits. `string.drop_end` walks the entire
/// rendered Terraform via Intl.Segmenter to count graphemes from the end —
/// pure overhead for an ASCII trailing newline, and called once per resource
/// (~600× on the huge corpus, where it was the largest residual grapheme cost).
@external(erlang, "codegen_ffi", "drop_end_codeunits")
@external(javascript, "./codegen_ffi.mjs", "drop_end_codeunits")
fn drop_end_codeunits(s: String, n: Int) -> String
/// Render a Terraform config from resources, settings, providers, and variables.
/// Assembles the standard Config structure and renders it to HCL.
@internal
pub fn render_terraform_config(
resources resources: List(Resource),
settings settings: TerraformSettings,
providers providers: List(Provider),
variables variables: List(Variable),
) -> String {
let config =
terraform.Config(
terraform: option.Some(settings),
providers: providers,
resources: resources,
data_sources: [],
variables: variables,
outputs: [],
locals: [],
modules: [],
)
render.render_config(config)
}
/// Build an HCL comment identifying the source measurement and expectation.
@internal
pub fn build_source_comment(
metadata: IntermediateRepresentationMetaData,
) -> String {
"# Caffeine: "
<> metadata.org_name.value
<> "."
<> metadata.team_name.value
<> "."
<> metadata.service_name.value
<> "."
<> metadata.friendly_label.value
<> " (measurement: "
<> metadata.measurement_name.value
<> ")"
}
/// Render a single Terraform resource to HCL string (no trailing newline).
@internal
pub fn render_resource_to_string(resource: Resource) -> String {
let config =
terraform.Config(
terraform: option.None,
providers: [],
resources: [resource],
data_sources: [],
variables: [],
outputs: [],
locals: [],
modules: [],
)
render.render_config(config)
|> drop_end_codeunits(1)
}
/// Build a codegen resolution error with empty context.
@internal
pub fn resolution_error(
vendor vendor_name: String,
msg msg: String,
) -> CompilationError {
errors.generator_terraform_resolution_error(vendor: vendor_name, msg:)
}