diff options
Diffstat (limited to 'src/chomp/ast/error.rs')
-rw-r--r-- | src/chomp/ast/error.rs | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/src/chomp/ast/error.rs b/src/chomp/ast/error.rs index d2c49cd..7be5354 100644 --- a/src/chomp/ast/error.rs +++ b/src/chomp/ast/error.rs @@ -14,13 +14,43 @@ pub enum SubstituteError { impl From<SubstituteError> for syn::Error { fn from(e: SubstituteError) -> Self { - todo!() + match e { + SubstituteError::FreeParameter { span, .. } => { + Self::new(span.unwrap_or_else(Span::call_site), "unbound parameter") + } + SubstituteError::WrongArgCount { call, expected, span } => { + let msg = if call.args.len() == 1 { + format!("this function takes {} arguments but 1 was supplied", expected) + } else { + format!("this function takes {} arguments but {} were supplied", expected, call.args.len()) + }; + + Self::new(span.unwrap_or_else(Span::call_site), msg) + } + } } } impl Display for SubstituteError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - todo!() + match self { + Self::FreeParameter { param, span, name } => { + let start = span.unwrap_or_else(Span::call_site).start(); + if let Some(name) = name { + write!(f, "{}:{}: unbound parameter `{}`", start.line, start.column, name) + } else { + write!(f, "{}:{}: unbound parameter '{}", start.line, start.column, param.index) + } + } + Self::WrongArgCount { call, expected, span } => { + let start = span.unwrap_or_else(Span::call_site).start(); + if call.args.len() == 1 { + write!(f, "{}:{}: this function takes {} arguments but 1 was supplied", start.line, start.column, expected) + } else { + write!(f, "{}:{}: this function takes {} arguments but {} were supplied", start.line, start.column, expected, call.args.len()) + } + } + } } } |