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/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 SourceLocation}
import caffeine_lang/rich_error.{type RichError}
import caffeine_lang/source_snippet
import gleam/int
import gleam/list
import gleam/option
import gleam/string
/// Renders a RichError to a plain-text string.
pub fn render_plain(error: RichError) -> String {
let code_str = rich_error.error_code_to_string(error.code)
let msg = rich_error.error_message(error.error)
// Header line: error[E103]: message
let header = "error[" <> code_str <> "]: " <> msg
// Location line: --> path:line:column
let location_line = case error.source_path, error.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 error.source_content, error.location {
option.Some(content), option.Some(loc) ->
option.Some(render_snippet(content, loc))
_, _ -> option.None
}
// Suggestion line
let suggestion_line = case error.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 RichErrors to a plain-text string.
pub fn render_all_plain(errors: List(RichError)) -> 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
}