blob: 3e0ec7521004c791d2e17c13442839d1614f3a61 [file] [log] [blame]
Chih-Hung Hsiehe42c5052020-04-16 10:44:21 -07001use std::fmt;
2use std::iter::repeat;
3
4/// An error that occurred during parsing or compiling a regular expression.
5#[derive(Clone, PartialEq)]
6pub enum Error {
7 /// A syntax error.
8 Syntax(String),
9 /// The compiled program exceeded the set size limit.
10 /// The argument is the size limit imposed.
11 CompiledTooBig(usize),
12 /// Hints that destructuring should not be exhaustive.
13 ///
14 /// This enum may grow additional variants, so this makes sure clients
15 /// don't count on exhaustive matching. (Otherwise, adding a new variant
16 /// could break existing code.)
17 #[doc(hidden)]
18 __Nonexhaustive,
19}
20
21impl ::std::error::Error for Error {
22 // TODO: Remove this method entirely on the next breaking semver release.
23 #[allow(deprecated)]
24 fn description(&self) -> &str {
25 match *self {
26 Error::Syntax(ref err) => err,
27 Error::CompiledTooBig(_) => "compiled program too big",
28 Error::__Nonexhaustive => unreachable!(),
29 }
30 }
31}
32
33impl fmt::Display for Error {
Joel Galenson38748082021-05-19 16:51:51 -070034 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
Chih-Hung Hsiehe42c5052020-04-16 10:44:21 -070035 match *self {
36 Error::Syntax(ref err) => err.fmt(f),
37 Error::CompiledTooBig(limit) => write!(
38 f,
39 "Compiled regex exceeds size limit of {} bytes.",
40 limit
41 ),
42 Error::__Nonexhaustive => unreachable!(),
43 }
44 }
45}
46
47// We implement our own Debug implementation so that we show nicer syntax
48// errors when people use `Regex::new(...).unwrap()`. It's a little weird,
49// but the `Syntax` variant is already storing a `String` anyway, so we might
50// as well format it nicely.
51impl fmt::Debug for Error {
Joel Galenson38748082021-05-19 16:51:51 -070052 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
Chih-Hung Hsiehe42c5052020-04-16 10:44:21 -070053 match *self {
54 Error::Syntax(ref err) => {
55 let hr: String = repeat('~').take(79).collect();
56 writeln!(f, "Syntax(")?;
57 writeln!(f, "{}", hr)?;
58 writeln!(f, "{}", err)?;
59 writeln!(f, "{}", hr)?;
60 write!(f, ")")?;
61 Ok(())
62 }
63 Error::CompiledTooBig(limit) => {
64 f.debug_tuple("CompiledTooBig").field(&limit).finish()
65 }
66 Error::__Nonexhaustive => {
67 f.debug_tuple("__Nonexhaustive").finish()
68 }
69 }
70 }
71}