From d61370656d9f3deb39bb37f9c1d45e8ddc62efd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edvard=20Th=C3=B6rnros?= Date: Sun, 10 Jan 2021 16:15:52 +0100 Subject: More errors! --- src/error.rs | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 src/error.rs (limited to 'src/error.rs') diff --git a/src/error.rs b/src/error.rs new file mode 100644 index 0000000..277be5f --- /dev/null +++ b/src/error.rs @@ -0,0 +1,48 @@ +use std::fmt; +use std::path::PathBuf; +use crate::vm::{Op, Value}; + +#[derive(Debug)] +pub enum ErrorKind { + TypeError(Op, Vec), + AssertFailed(Value, Value), + SyntaxError(usize), +} + +#[derive(Debug)] +pub struct Error { + pub kind: ErrorKind, + pub file: PathBuf, + pub line: usize, + pub message: Option, +} + +impl fmt::Display for ErrorKind { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + ErrorKind::TypeError(op, values) => { + let values = values + .iter() + .fold(String::new(), |a, v| { format!("{}, {:?}", a, v) }); + write!(f, "Cannot apply {:?} to values {}", op, values) + } + ErrorKind::AssertFailed(a, b) => { + write!(f, "Assertion failed, {:?} != {:?}.", a, b) + } + ErrorKind::SyntaxError(line) => { + write!(f, "Syntax error on line {}", line) + } + } + } +} + +impl fmt::Display for Error { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let message = match &self.message { + Some(s) => format!("\n{}", s), + None => String::from(""), + }; + write!(f, "{:?}:{} [Runtime Error] {}{}", self.file, self.line, self.kind, message) + } +} + -- cgit v1.2.1