Packages
caffeine_lang
6.2.1
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/frontend/pipeline.gleam
/// Frontend pipeline for compiling .caffeine source files.
/// Orchestrates the tokenizer, parser, validator, and lowering
/// to transform .caffeine source into Measurement and Expectation types.
import caffeine_lang/errors.{type CompilationError}
import caffeine_lang/frontend/lowering
import caffeine_lang/frontend/parser
import caffeine_lang/frontend/parser_error
import caffeine_lang/frontend/validator
import caffeine_lang/linker/expectations.{type Expectation}
import caffeine_lang/linker/measurements.{type Measurement, type Raw}
import caffeine_lang/source_file.{
type ExpectationSource, type MeasurementSource, type SourceFile,
}
import gleam/list
import gleam/result
/// Compiles a measurements .caffeine source to a list of raw (unvalidated) measurements.
@internal
pub fn compile_measurements(
source: SourceFile(MeasurementSource),
) -> Result(List(Measurement(Raw)), CompilationError) {
use ast <- result.try(
parser.parse_measurements_file(source.content)
|> result.map_error(errs_to_compilation_error(
_,
source.path,
parser_error.to_string,
errors.frontend_parse_error,
)),
)
use validated <- result.try(
validator.validate_measurements_file(ast)
|> result.map_error(errs_to_compilation_error(
_,
source.path,
validator.error_to_string,
errors.frontend_validation_error,
)),
)
Ok(lowering.lower_measurements(validated))
}
/// Compiles an expects .caffeine source to a list of expectations.
@internal
pub fn compile_expects(
source: SourceFile(ExpectationSource),
) -> Result(List(Expectation), CompilationError) {
use ast <- result.try(
parser.parse_expects_file(source.content)
|> result.map_error(errs_to_compilation_error(
_,
source.path,
parser_error.to_string,
errors.frontend_parse_error,
)),
)
use validated <- result.try(
validator.validate_expects_file(ast)
|> result.map_error(errs_to_compilation_error(
_,
source.path,
validator.error_to_string,
errors.frontend_validation_error,
)),
)
Ok(lowering.lower_expectations(validated))
}
/// Converts a list of stage-specific errors to a CompilationError, parameterised
/// by the renderer and the smart-constructor for the wrapping error kind.
fn errs_to_compilation_error(
errs: List(err),
file_path: String,
to_string: fn(err) -> String,
make: fn(String) -> CompilationError,
) -> CompilationError {
let to_compilation = fn(err) { make(file_path <> ": " <> to_string(err)) }
case errs {
[single] -> to_compilation(single)
multiple ->
errors.CompilationErrors(errors: list.map(multiple, to_compilation))
}
}