Packages
caffeine_lang
5.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/error_renderer.gleam
/// Plain-text error renderer (no ANSI codes).
/// Composes error code, message, location, source snippet, and suggestion
/// into Rust/Elm-style diagnostic output.
import caffeine_lang/errors.{type CompilationError, type SourceLocation}
import caffeine_lang/source_snippet
import gleam/int
import gleam/list
import gleam/option
import gleam/string
/// Renders a CompilationError to a plain-text diagnostic string.
pub fn render_plain(error: CompilationError) -> String {
let code_str = errors.error_code_to_string(errors.error_code_for(error))
let msg = errors.to_message(error)
let ctx = errors.error_context(error)
// Header line: error[E103]: message
let header = "error[" <> code_str <> "]: " <> msg
// Location line: --> path:line:column
let location_line = case ctx.source_path, ctx.location {
option.Some(path), option.Some(loc) ->
option.Some(
" --> "
<> path
<> ":"
<> int.to_string(loc.line)
<> ":"
<> int.to_string(loc.column),
)
option.Some(path), option.None -> option.Some(" --> " <> path)
_, _ -> option.None
}
// Source snippet
let snippet = case ctx.source_content, ctx.location {
option.Some(content), option.Some(loc) ->
option.Some(render_snippet(content, loc))
_, _ -> option.None
}
// Suggestion line
let suggestion_line = case ctx.suggestion {
option.Some(suggestion) ->
option.Some(" = help: Did you mean '" <> suggestion <> "'?")
option.None -> option.None
}
// Compose all parts
[option.Some(header), location_line, snippet, suggestion_line]
|> list.filter_map(fn(opt) {
case opt {
option.Some(val) -> Ok(val)
option.None -> Error(Nil)
}
})
|> string.join("\n")
}
/// Renders a list of CompilationErrors to a plain-text string.
pub fn render_all_plain(errors: List(CompilationError)) -> String {
errors
|> list.map(render_plain)
|> string.join("\n\n")
}
/// Renders a source snippet for the given content and location.
fn render_snippet(content: String, loc: SourceLocation) -> String {
let snippet =
source_snippet.extract_snippet(
content,
loc.line,
loc.column,
loc.end_column,
)
snippet.rendered
}