1use std::fmt::Display;
2
3use crate::ast::{InvalidAttributeName, InvalidAttributeValue, InvalidBlockName, InvalidRaw};
4use crate::parser::ParseError;
5
6#[derive(Debug)]
7enum ErrorKind {
8 Parse(ParseError),
9 InvalidBlockName(InvalidBlockName),
10 InvalidAttributeName(InvalidAttributeName),
11 InvalidAttributeValue(InvalidAttributeValue),
12 InvalidRaw(InvalidRaw),
13}
14
15#[derive(Debug)]
20pub struct Error(ErrorKind);
21
22impl Error {
23 fn get_ref(&self) -> &(dyn std::error::Error + 'static) {
24 let Self(inner) = self;
25
26 match inner {
27 ErrorKind::Parse(err) => err,
28 ErrorKind::InvalidBlockName(err) => err,
29 ErrorKind::InvalidAttributeName(err) => err,
30 ErrorKind::InvalidAttributeValue(err) => err,
31 ErrorKind::InvalidRaw(err) => err,
32 }
33 }
34}
35
36impl Display for Error {
37 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
38 Display::fmt(&self.get_ref(), f)
39 }
40}
41
42impl std::error::Error for Error {
43 fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
44 self.get_ref().source()
45 }
46}
47
48impl From<ParseError> for Error {
49 fn from(err: ParseError) -> Self {
50 Self(ErrorKind::Parse(err))
51 }
52}
53
54impl From<InvalidBlockName> for Error {
55 fn from(err: InvalidBlockName) -> Self {
56 Self(ErrorKind::InvalidBlockName(err))
57 }
58}
59
60impl From<InvalidAttributeName> for Error {
61 fn from(err: InvalidAttributeName) -> Self {
62 Self(ErrorKind::InvalidAttributeName(err))
63 }
64}
65
66impl From<InvalidAttributeValue> for Error {
67 fn from(err: InvalidAttributeValue) -> Self {
68 Self(ErrorKind::InvalidAttributeValue(err))
69 }
70}
71
72impl From<InvalidRaw> for Error {
73 fn from(err: InvalidRaw) -> Self {
74 Self(ErrorKind::InvalidRaw(err))
75 }
76}