Packages
caffeine_lang
5.1.0
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/linker/linker.gleam
import caffeine_lang/errors.{type CompilationError}
import caffeine_lang/frontend/pipeline
import caffeine_lang/linker/artifacts.{type ParamInfo}
import caffeine_lang/linker/expectations
import caffeine_lang/linker/ir.{type IntermediateRepresentation, type Linked}
import caffeine_lang/linker/ir_builder
import caffeine_lang/linker/measurements
import caffeine_lang/source_file.{
type ExpectationSource, type SourceFile, type VendorMeasurementSource,
}
import gleam/dict
import gleam/list
import gleam/result
/// Links measurement sources and expectation sources into intermediate representations.
/// Each measurement source is paired with a vendor derived from its filename.
/// All file reading happens before this function is called — it operates purely
/// on in-memory source content.
@internal
pub fn link(
measurements: List(VendorMeasurementSource),
expectation_sources: List(SourceFile(ExpectationSource)),
slo_params slo_params: dict.Dict(String, ParamInfo),
) -> Result(List(IntermediateRepresentation(Linked)), CompilationError) {
let reserved_labels = ir_builder.reserved_labels(slo_params)
// Compile each vendor measurement source and pair measurements with their vendor.
use compiled_pairs <- result.try(
measurements
|> list.map(fn(vbs) {
pipeline.compile_measurements(vbs.source)
|> result.map(fn(raw_bps) { #(raw_bps, vbs.vendor) })
})
|> errors.from_results(),
)
// Flatten all raw measurements and build vendor lookup.
let all_raw_measurements =
compiled_pairs |> list.flat_map(fn(pair) { pair.0 })
let vendor_lookup =
compiled_pairs
|> list.flat_map(fn(pair) {
let #(raw_bps, v) = pair
list.map(raw_bps, fn(bp) { #(bp.name, v) })
})
|> dict.from_list
// Validate all measurements together (enforces global uniqueness).
use validated_measurements <- result.try(measurements.validate_measurements(
all_raw_measurements,
slo_params,
))
use expectations_with_paths <- result.try(parse_expectation_sources(
expectation_sources,
validated_measurements,
slo_params,
))
ir_builder.build_all(
expectations_with_paths,
reserved_labels:,
vendor_lookup:,
slo_params:,
)
}
fn parse_expectation_sources(
sources: List(SourceFile(ExpectationSource)),
validated_measurements: List(
measurements.Measurement(measurements.MeasurementValidated),
),
slo_params: dict.Dict(String, ParamInfo),
) {
sources
|> list.map(fn(source) {
pipeline.compile_expects(source)
|> result.try(fn(raw_expectations) {
expectations.validate_expectations(
raw_expectations,
validated_measurements,
slo_params: slo_params,
from: source.path,
)
})
|> result.map(fn(exps) { #(exps, source.path) })
})
|> errors.from_results()
}