1 use crate::parse::Error; 2 use core::fmt::{self, Debug, Display}; 3 4 pub(crate) enum ErrorKind { 5 UnexpectedEnd(Position), 6 UnexpectedChar(Position, char), 7 UnexpectedCharAfter(Position, char), 8 ExpectedCommaFound(Position, char), 9 LeadingZero(Position), 10 Overflow(Position), 11 EmptySegment(Position), 12 IllegalCharacter(Position), 13 UnexpectedAfterWildcard, 14 ExcessiveComparators, 15 } 16 17 #[derive(Copy, Clone, Eq, PartialEq)] 18 pub(crate) enum Position { 19 Major, 20 Minor, 21 Patch, 22 Pre, 23 Build, 24 } 25 26 #[cfg(feature = "std")] 27 #[cfg_attr(doc_cfg, doc(cfg(feature = "std")))] 28 impl std::error::Error for Error {} 29 30 impl Display for Error { fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result31 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { 32 match &self.kind { 33 ErrorKind::UnexpectedEnd(pos) => { 34 formatter.write_str("unexpected end of input while parsing ")?; 35 Display::fmt(pos, formatter)?; 36 Ok(()) 37 } 38 ErrorKind::UnexpectedChar(pos, ch) => { 39 formatter.write_str("unexpected character ")?; 40 Debug::fmt(ch, formatter)?; 41 formatter.write_str(" while parsing ")?; 42 Display::fmt(pos, formatter)?; 43 Ok(()) 44 } 45 ErrorKind::UnexpectedCharAfter(pos, ch) => { 46 formatter.write_str("unexpected character ")?; 47 Debug::fmt(ch, formatter)?; 48 formatter.write_str(" after ")?; 49 Display::fmt(pos, formatter)?; 50 Ok(()) 51 } 52 ErrorKind::ExpectedCommaFound(pos, ch) => { 53 formatter.write_str("expected comma after ")?; 54 Display::fmt(pos, formatter)?; 55 formatter.write_str(", found ")?; 56 Debug::fmt(ch, formatter)?; 57 Ok(()) 58 } 59 ErrorKind::LeadingZero(pos) => { 60 formatter.write_str("invalid leading zero in ")?; 61 Display::fmt(pos, formatter)?; 62 Ok(()) 63 } 64 ErrorKind::Overflow(pos) => { 65 formatter.write_str("value of ")?; 66 Display::fmt(pos, formatter)?; 67 formatter.write_str(" exceeds u64::MAX")?; 68 Ok(()) 69 } 70 ErrorKind::EmptySegment(pos) => { 71 formatter.write_str("empty identifier segment in ")?; 72 Display::fmt(pos, formatter)?; 73 Ok(()) 74 } 75 ErrorKind::IllegalCharacter(pos) => { 76 formatter.write_str("unexpected character in ")?; 77 Display::fmt(pos, formatter)?; 78 Ok(()) 79 } 80 ErrorKind::UnexpectedAfterWildcard => { 81 formatter.write_str("unexpected character after wildcard in version req") 82 } 83 ErrorKind::ExcessiveComparators => { 84 formatter.write_str("excessive number of version comparators") 85 } 86 } 87 } 88 } 89 90 impl Display for Position { fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result91 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { 92 formatter.write_str(match self { 93 Position::Major => "major version number", 94 Position::Minor => "minor version number", 95 Position::Patch => "patch version number", 96 Position::Pre => "pre-release identifier", 97 Position::Build => "build metadata", 98 }) 99 } 100 } 101 102 impl Debug for Error { fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result103 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { 104 formatter.write_str("Error(\"")?; 105 Display::fmt(self, formatter)?; 106 formatter.write_str("\")")?; 107 Ok(()) 108 } 109 } 110