use thiserror::Error;
use crate::lexer::Span;
#[derive(Debug, Error, PartialEq)]
pub enum ParseError {
#[error("Unknown: {str} at {span}")]
UnknownToken { str: String, span: Span },
#[error("Internal Error at {span}: {reason}")]
InternalError { reason: String, span: Span },
#[error("Return value parsed is wrong: {0}")]
WrongReturn(String),
#[error("Invalid formula at {span}: {reason}")]
InvalidFormula{ reason: String, span: Span },
#[error("Missing function arguments for {func} at {span}")]
MissingArgs { func: String, span: Span },
#[error("Missing right operand for {operator} at {span}")]
MissingRightOperator { operator: String, span: Span },
#[error("Missing left operand for {operator} at {span}")]
MissingLeftOperator { operator: String, span: Span },
#[error("Undefined derivative of {func} for {idx} at {span}")]
DerivativeUndefined { func: String, idx: usize, span: Span },
#[error("Invalid derivative at {span}: {reason}")]
InvalidDerivative { span: Span, reason: String },
#[error("Invalid derivative order {order} at {span}")]
InvalidDerivativeOrder { span: Span, order: String },
#[error("Argument Index for {func} at {span} is out of range: {idx}")]
OutOfRange { func: String, idx: usize, span: Span },
}
#[derive(Debug, Error, PartialEq)]
pub enum InitializeError
{
#[error("Mismatched number of derivatives ({number}): expected {expected}")]
DerivativesNumberMismatched { expected: usize, number: usize }
}