pub struct Error { /* private fields */ }Expand description
Why a schematic could not be forged into a Language,
or a capability pipeline could not be assembled.
Forging checks the whole schematic and reports every problem it finds, not
just the first, so one round of fixes is usually enough. Each problem is a
Diagnostic whose label points into the schematic text: byte offsets
counted from the start of the string handed to
Language::from_lsf. Add that text to a fresh
SourceMap and the spans line up, so
Renderer can draw each problem under the line at
fault.
Display prints the first problem as line:column: message, which is
enough for a log line or a test failure; render the diagnostics for the
full picture.
§What to do with one
An Error always means the schematic needs editing: forging is
deterministic, so retrying the same text fails the same way. Every message
names what was found and what was expected, and many carry a help line
with the fix.
§Examples
use lang_forge::Language;
use lang_forge::diag_lang::{Renderer, SourceMap};
let schematic = r#"
[language]
name = "broken"
[rules]
program = "stmt*"
stmt = "exprr ';'"
expr = "NUMBER"
"#;
let err = Language::from_lsf(schematic).unwrap_err();
assert_eq!(err.to_string(), "7:12: undefined rule `exprr`");
assert_eq!(err.diagnostics().len(), 1);
// Render it with source context.
let mut map = SourceMap::new();
map.add("broken.lsf", schematic).expect("fits");
let text = Renderer::new().render(&err.diagnostics()[0], &map);
assert!(text.contains("help: did you mean `expr`?"));Implementations§
Source§impl Error
impl Error
Sourcepub fn diagnostics(&self) -> &[Diagnostic]
pub fn diagnostics(&self) -> &[Diagnostic]
Every problem found, in the order they appear in the schematic.
Never empty. Spans are byte offsets into the schematic text.
§Examples
use lang_forge::Language;
let err = Language::from_lsf("[language]\n[rules]\n").unwrap_err();
let messages: Vec<&str> = err.diagnostics().iter().map(|d| d.message()).collect();
assert_eq!(messages, ["missing `name` in [language]", "[rules] declares no rules"]);Trait Implementations§
impl Eq for Error
Source§impl Error for Error
impl Error for Error
1.30.0 · Source§fn source(&self) -> Option<&(dyn Error + 'static)>
fn source(&self) -> Option<&(dyn Error + 'static)>
1.0.0 · Source§fn description(&self) -> &str
fn description(&self) -> &str
use the Display impl or to_string()