1 | use std::fmt; |
2 | |
3 | #[derive (Debug)] |
4 | pub struct ParseError { |
5 | kind: ParseErrorKind, |
6 | orig: String, |
7 | } |
8 | |
9 | #[non_exhaustive ] |
10 | #[derive (Debug)] |
11 | pub enum ParseErrorKind { |
12 | UnterminatedString, |
13 | UnexpectedChar(char), |
14 | UnexpectedToken { |
15 | expected: &'static str, |
16 | found: &'static str, |
17 | }, |
18 | IncompleteExpr(&'static str), |
19 | UnterminatedExpression(String), |
20 | InvalidTarget(String), |
21 | } |
22 | |
23 | impl fmt::Display for ParseError { |
24 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { |
25 | write!( |
26 | f, |
27 | "failed to parse ` {}` as a cfg expression: {}" , |
28 | self.orig, self.kind |
29 | ) |
30 | } |
31 | } |
32 | |
33 | impl fmt::Display for ParseErrorKind { |
34 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { |
35 | use ParseErrorKind::*; |
36 | match self { |
37 | UnterminatedString => write!(f, "unterminated string in cfg" ), |
38 | UnexpectedChar(ch: &char) => write!( |
39 | f, |
40 | "unexpected character ` {}` in cfg, expected parens, a comma, \ |
41 | an identifier, or a string" , |
42 | ch |
43 | ), |
44 | UnexpectedToken { expected: &&str, found: &&str } => { |
45 | write!(f, "expected {}, found {}" , expected, found) |
46 | } |
47 | IncompleteExpr(expected: &&str) => { |
48 | write!(f, "expected {}, but cfg expression ended" , expected) |
49 | } |
50 | UnterminatedExpression(s: &String) => { |
51 | write!(f, "unexpected content ` {}` found after cfg expression" , s) |
52 | } |
53 | InvalidTarget(s: &String) => write!(f, "invalid target specifier: {}" , s), |
54 | } |
55 | } |
56 | } |
57 | |
58 | impl std::error::Error for ParseError {} |
59 | |
60 | impl ParseError { |
61 | pub fn new(orig: &str, kind: ParseErrorKind) -> ParseError { |
62 | ParseError { |
63 | kind, |
64 | orig: orig.to_string(), |
65 | } |
66 | } |
67 | } |
68 | |