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