Packages
caffeine_lang
3.0.6
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/parser/linker.gleam
import caffeine_lang/common/errors.{type CompilationError}
import caffeine_lang/frontend/pipeline
import caffeine_lang/middle_end/semantic_analyzer.{
type IntermediateRepresentation,
}
import caffeine_lang/parser/artifacts
import caffeine_lang/parser/blueprints
import caffeine_lang/parser/expectations
import caffeine_lang/parser/file_discovery
import caffeine_lang/parser/ir_builder
import gleam/list
import gleam/result
/// Link will fetch, then parse all configuration files, combining them into one single
/// list of intermediate representation objects. In the future how we fetch these files will
/// change to enable fetching from remote locations, via git, etc. but for now we
/// just support standard library artifacts, a single blueprint file, and a single
/// expectations directory. Furthermore note that we will ignore non-.caffeine files within
/// an org's team's expectation directory and incorrectly placed .caffeine files will also
/// be ignored.
///
/// ASSUMPTIONS:
/// * specific known directories for expectations and blueprints
/// * no mixed type files
/// * all files are `.caffeine`
@internal
pub fn link(
blueprint_file_path: String,
expectations_directory: String,
) -> Result(List(IntermediateRepresentation), CompilationError) {
use expectation_files <- result.try(file_discovery.get_caffeine_files(
expectations_directory,
))
use artifacts <- result.try(artifacts.parse_standard_library())
// Compile blueprints .caffeine file to JSON, then parse
use blueprints_json <- result.try(pipeline.compile_blueprints_file(
blueprint_file_path,
))
use blueprints <- result.try(blueprints.parse_from_json_string(
blueprints_json,
artifacts,
))
use expectations_with_paths <- result.try(parse_expectation_files(
expectation_files,
blueprints,
))
Ok(ir_builder.build_all(expectations_with_paths))
}
fn parse_expectation_files(
files: List(String),
blueprints: List(blueprints.Blueprint),
) {
files
|> list.map(fn(file_path) {
// Compile expects .caffeine file to JSON, then parse
pipeline.compile_expects_file(file_path)
|> result.try(fn(json) {
expectations.parse_from_json_string(json, blueprints)
})
|> result.map(fn(exps) { #(exps, file_path) })
})
|> result.all()
}