1use std::fmt;
2
3#[derive(Debug)]
4pub struct ParseError {
5 kind: ParseErrorKind,
6 orig: String,
7}
8
9#[non_exhaustive]
10#[derive(Debug)]
11pub 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
23impl 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
33impl 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
58impl std::error::Error for ParseError {}
59
60impl ParseError {
61 pub fn new(orig: &str, kind: ParseErrorKind) -> ParseError {
62 ParseError {
63 kind,
64 orig: orig.to_string(),
65 }
66 }
67}
68