Packages
caffeine_lang
4.3.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/linker/ir.gleam
/// Core IR types for the Caffeine compiler pipeline.
/// These types represent the intermediate representation between linking and code generation.
import caffeine_lang/analysis/vendor.{type Vendor}
import caffeine_lang/helpers.{type ValueTuple}
import caffeine_lang/linker/artifacts.{
type ArtifactType, type DependencyRelationType, DependencyRelations, SLO,
}
import gleam/dict
import gleam/option.{type Option}
/// Structured SLO artifact fields extracted from raw values.
pub type SloFields {
SloFields(
threshold: Float,
indicators: dict.Dict(String, String),
window_in_days: Int,
evaluation: Option(String),
tags: List(#(String, String)),
runbook: Option(String),
)
}
/// Structured dependency artifact fields extracted from raw values.
pub type DependencyFields {
DependencyFields(
relations: dict.Dict(DependencyRelationType, List(String)),
tags: List(#(String, String)),
)
}
/// Artifact-specific data stored as a dict from artifact type to fields.
pub type ArtifactData {
ArtifactData(fields: dict.Dict(ArtifactType, ArtifactFields))
}
/// Wrapper for artifact-specific field data.
pub type ArtifactFields {
SloArtifactFields(SloFields)
DependencyArtifactFields(DependencyFields)
}
/// Internal representation of a parsed expectation with metadata and values.
pub type IntermediateRepresentation {
IntermediateRepresentation(
metadata: IntermediateRepresentationMetaData,
unique_identifier: String,
artifact_refs: List(ArtifactType),
values: List(ValueTuple),
artifact_data: ArtifactData,
vendor: Option(Vendor),
)
}
/// Metadata associated with an intermediate representation including organization and service identifiers.
pub type IntermediateRepresentationMetaData {
IntermediateRepresentationMetaData(
friendly_label: String,
org_name: String,
service_name: String,
blueprint_name: String,
team_name: String,
/// Metadata specific to any given expectation.
misc: dict.Dict(String, List(String)),
)
}
/// Build a dotted identifier from IR metadata: org.team.service.name
@internal
pub fn ir_to_identifier(ir: IntermediateRepresentation) -> String {
ir.metadata.org_name
<> "."
<> ir.metadata.team_name
<> "."
<> ir.metadata.service_name
<> "."
<> ir.metadata.friendly_label
}
/// Extract SloFields from ArtifactData, if present.
@internal
pub fn get_slo_fields(data: ArtifactData) -> Option(SloFields) {
case dict.get(data.fields, SLO) {
Ok(SloArtifactFields(slo)) -> option.Some(slo)
_ -> option.None
}
}
/// Extract DependencyFields from ArtifactData, if present.
@internal
pub fn get_dependency_fields(data: ArtifactData) -> Option(DependencyFields) {
case dict.get(data.fields, DependencyRelations) {
Ok(DependencyArtifactFields(dep)) -> option.Some(dep)
_ -> option.None
}
}
/// Creates ArtifactData containing only SLO fields.
@internal
pub fn slo_only(slo: SloFields) -> ArtifactData {
ArtifactData(fields: dict.from_list([#(SLO, SloArtifactFields(slo))]))
}
/// Creates ArtifactData containing only dependency fields.
@internal
pub fn dependency_only(dep: DependencyFields) -> ArtifactData {
ArtifactData(
fields: dict.from_list([
#(DependencyRelations, DependencyArtifactFields(dep)),
]),
)
}
/// Creates ArtifactData containing both SLO and dependency fields.
@internal
pub fn slo_with_dependency(
slo slo: SloFields,
dependency dep: DependencyFields,
) -> ArtifactData {
ArtifactData(
fields: dict.from_list([
#(SLO, SloArtifactFields(slo)),
#(DependencyRelations, DependencyArtifactFields(dep)),
]),
)
}
/// Update SloFields within ArtifactData using a transformation function.
@internal
pub fn update_slo_fields(
data: ArtifactData,
updater: fn(SloFields) -> SloFields,
) -> ArtifactData {
case dict.get(data.fields, SLO) {
Ok(SloArtifactFields(slo)) ->
ArtifactData(fields: dict.insert(
data.fields,
SLO,
SloArtifactFields(updater(slo)),
))
_ -> data
}
}