1use 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 { 34 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 35 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 { 52 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 53 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} 72