summaryrefslogtreecommitdiff
path: root/src/chomp/ast-old/error.rs
diff options
context:
space:
mode:
authorGreg Brown <gmb60@cam.ac.uk>2021-04-27 13:07:27 +0100
committerGreg Brown <gmb60@cam.ac.uk>2021-04-27 13:07:27 +0100
commit51dcf19eb6f8d2127f3dedfc1d7d5326d7a8017b (patch)
tree9d66a63fa1d017cad1b4483399950bf216d58bf8 /src/chomp/ast-old/error.rs
parent61eb62dde6a62cf19d33d5c689b0c3a4f36d93c3 (diff)
Start rewrite using query system.queries
Diffstat (limited to 'src/chomp/ast-old/error.rs')
-rw-r--r--src/chomp/ast-old/error.rs52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/chomp/ast-old/error.rs b/src/chomp/ast-old/error.rs
new file mode 100644
index 0000000..9057ec3
--- /dev/null
+++ b/src/chomp/ast-old/error.rs
@@ -0,0 +1,52 @@
+use super::{Expression, Lambda, NamedExpression};
+use proc_macro2::Span;
+use std::{
+ error::Error,
+ fmt::{self, Display},
+};
+
+#[derive(Debug)]
+pub enum TranslateError {
+ CallNotAFunction {
+ on: Expression,
+ span: Option<Span>,
+ },
+ WrongArgCount {
+ lambda: Lambda,
+ args: Vec<NamedExpression>,
+ span: Option<Span>,
+ },
+}
+
+impl From<TranslateError> for syn::Error {
+ fn from(e: TranslateError) -> Self {
+ let msg = e.to_string();
+ let span = match e {
+ TranslateError::CallNotAFunction { span, .. }
+ | TranslateError::WrongArgCount { span, .. } => span,
+ };
+
+ Self::new(span.unwrap_or_else(Span::call_site), msg)
+ }
+}
+
+impl Display for TranslateError {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ match self {
+ Self::CallNotAFunction { .. } => {
+ write!(f, "call expected a function")
+ }
+ Self::WrongArgCount { lambda, args, .. } => match (lambda.args.len(), args.len()) {
+ (1, n) => write!(f, "this function takes 1 argument but {} were supplied", n),
+ (m, _) => write!(f, "this function takes {} arguments but 1 was supplied", m),
+ (m, n) => write!(
+ f,
+ "this function takes {} arguments but {} were supplied",
+ m, n
+ ),
+ },
+ }
+ }
+}
+
+impl Error for TranslateError {}