Packages
caffeine_lang
1.0.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/common/errors.gleam
import gleam/dynamic/decode
import gleam/json
import gleam/list
import gleam/option
import gleam/string
/// Represents top level compilation errors.
pub type CompilationError {
// Parser Phase (part of initial parse & link step)
ParserFileReadError(msg: String)
ParserJsonParserError(msg: String)
ParserDuplicateError(msg: String)
// Linker Phase (part of initial parse & link step)
LinkerParseError(msg: String)
LinkerSemanticError(msg: String)
// Semantic Analysis Phase
SemanticAnalysisVendorResolutionError(msg: String)
SemanticAnalysisTemplateParseError(msg: String)
SemanticAnalysisTemplateResolutionError(msg: String)
// Code Generation Phase
GeneratorSloQueryResolutionError(msg: String)
GeneratorDatadogTerraformResolutionError(msg: String)
// Caffeine Query Language (CQL)
CQLResolverError(msg: String)
CQLParserError(msg: String)
CQLGeneratorError(msg: String)
}
// =============================================================================
// JSON Decode Error Formatting
// =============================================================================
/// Converts a JSON decode error into a CompilationError. Useful for leveraging the
/// custom errors we have per compilation phase vs. the lower level ones from
/// various libraries we leverage.
pub fn format_json_decode_error(error: json.DecodeError) -> CompilationError {
let msg = format_json_decode_error_to_string(error)
ParserJsonParserError(msg:)
}
/// Converts a JSON decode error directly to a string (for browser error messages).
pub fn format_json_decode_error_to_string(error: json.DecodeError) -> String {
case error {
json.UnexpectedEndOfInput -> "Unexpected end of input."
json.UnexpectedByte(val) -> "Unexpected byte: " <> val <> "."
json.UnexpectedSequence(val) -> "Unexpected sequence: " <> val <> "."
json.UnableToDecode(suberrors) -> {
"Incorrect types: "
<> suberrors |> format_decode_error_message(option.None)
}
}
}
/// Normalizes type names across targets (JS uses "Array", Erlang uses "List").
fn normalize_type_name(name: String) -> String {
case name {
"Array" -> "List"
other -> other
}
}
/// Formats a list of decode errors into a human-readable string.
pub fn format_decode_error_message(
errors: List(decode.DecodeError),
type_key_identifier: option.Option(String),
) -> String {
errors
|> list.map(fn(error) {
"expected ("
<> error.expected
<> ") received ("
<> normalize_type_name(error.found)
<> ") for ("
<> {
case { error.path |> string.join(".") }, type_key_identifier {
"", option.None -> "Unknown"
_, option.None -> {
error.path |> string.join(".")
}
"", option.Some(val) -> val
_, _ -> {
error.path |> string.join(".")
}
}
}
<> ")"
})
|> string.join(", ")
}