1use std::fmt;
2
3use crate::tokenizer::TokenType;
4
5#[derive(Debug)]
7pub enum Error {
8 BaseUrlRequired,
9 BaseUrlWithInit,
10 Tokenizer(TokenizerError, usize),
11 Parser(ParserError),
12 Url(url::ParseError),
13 RegExp(()),
14}
15
16impl fmt::Display for Error {
17 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
18 match self {
19 Error::BaseUrlRequired => {
20 f.write_str("a relative input without a base URL is not valid")
21 }
22 Error::BaseUrlWithInit => f.write_str(
23 "specifying both an init object, and a separate base URL is not valid",
24 ),
25 Error::Tokenizer(err, pos) => {
26 write!(f, "tokenizer error: {err} (at char {pos})")
27 }
28 Error::Parser(err) => write!(f, "parser error: {err}"),
29 Error::Url(err) => err.fmt(f),
30 Error::RegExp(_) => f.write_str("regexp error"),
31 }
32 }
33}
34
35impl std::error::Error for Error {}
36
37#[derive(Debug)]
38pub enum TokenizerError {
39 IncompleteEscapeCode,
40 InvalidName,
41 InvalidRegex(&'static str),
42}
43
44impl fmt::Display for TokenizerError {
45 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
46 match self {
47 Self::IncompleteEscapeCode => f.write_str("incomplete escape code"),
48 Self::InvalidName => {
49 f.write_str("invalid name; must be at least length 1")
50 }
51 Self::InvalidRegex(err) => write!(f, "invalid regex: {err}"),
52 }
53 }
54}
55
56impl std::error::Error for TokenizerError {}
57
58#[derive(Debug)]
59pub enum ParserError {
60 ExpectedToken(TokenType, TokenType, String),
61 DuplicateName(String),
62}
63
64impl fmt::Display for ParserError {
65 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
66 match self {
67 Self::ExpectedToken(expected_ty, found_ty, found_val) => {
68 write!(
69 f,
70 "expected token {expected_ty:?}, found '{found_val}' of type {found_ty:?}"
71 )
72 }
73 Self::DuplicateName(name) => {
74 write!(f, "pattern contains duplicate name {name}")
75 }
76 }
77 }
78}
79
80impl std::error::Error for ParserError {}