Improve and expand errors
This commit is contained in:
parent
da5122358e
commit
799b5d838c
@ -10,6 +10,7 @@ pub enum Error {
|
|||||||
Parse { expected: String, span: SimpleSpan },
|
Parse { expected: String, span: SimpleSpan },
|
||||||
Lex { expected: String, span: SimpleSpan },
|
Lex { expected: String, span: SimpleSpan },
|
||||||
Runtime(RuntimeError),
|
Runtime(RuntimeError),
|
||||||
|
Validation(ValidationError),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<Rich<'_, char>> for Error {
|
impl From<Rich<'_, char>> for Error {
|
||||||
@ -92,7 +93,7 @@ pub fn create_report<'a>(errors: &'a [Error]) -> Report<'a> {
|
|||||||
let mut report = Report::build(ReportKind::Error, (), 0);
|
let mut report = Report::build(ReportKind::Error, (), 0);
|
||||||
|
|
||||||
for error in errors {
|
for error in errors {
|
||||||
match error {
|
match &error {
|
||||||
Error::Parse { expected, span } => {
|
Error::Parse { expected, span } => {
|
||||||
report = report.with_label(
|
report = report.with_label(
|
||||||
Label::new(span.start..span.end).with_message(format!("Expected {expected}.")),
|
Label::new(span.start..span.end).with_message(format!("Expected {expected}.")),
|
||||||
@ -109,6 +110,7 @@ pub fn create_report<'a>(errors: &'a [Error]) -> Report<'a> {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
Error::Runtime(_) => todo!(),
|
Error::Runtime(_) => todo!(),
|
||||||
|
Error::Validation(_) => todo!(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
14
src/lib.rs
14
src/lib.rs
@ -24,6 +24,20 @@ impl Interpreter {
|
|||||||
pub fn run(&mut self, source: &str) -> Result<Value, Vec<Error>> {
|
pub fn run(&mut self, source: &str) -> Result<Value, Vec<Error>> {
|
||||||
let tokens = lex(source)?;
|
let tokens = lex(source)?;
|
||||||
let statements = parse(&tokens)?;
|
let statements = parse(&tokens)?;
|
||||||
|
let errors = statements
|
||||||
|
.iter()
|
||||||
|
.filter_map(|(statement, _span)| {
|
||||||
|
if let Some(error) = statement.validate(&self.context).err() {
|
||||||
|
Some(Error::Validation(error))
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.collect::<Vec<Error>>();
|
||||||
|
|
||||||
|
if !errors.is_empty() {
|
||||||
|
return Err(errors);
|
||||||
|
}
|
||||||
|
|
||||||
let mut value = Value::none();
|
let mut value = Value::none();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user