urlpattern/
error.rs

1use std::fmt;
2
3use crate::tokenizer::TokenType;
4
5/// A error occurring during URL pattern construction, or matching.
6#[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 {}