tabled_derive/
error.rs

1use proc_macro2::Span;
2
3#[derive(Debug, Clone)]
4pub enum Error {
5    Syn(syn::Error),
6    Custom {
7        span: Span,
8        error: String,
9        help: Option<String>,
10    },
11}
12
13impl Error {
14    pub fn new<E>(error: E, span: Span, help: Option<String>) -> Self
15    where
16        E: Into<String>,
17    {
18        let error = error.into();
19        Self::Custom { error, help, span }
20    }
21
22    pub fn message<E>(error: E) -> Self
23    where
24        E: Into<String>,
25    {
26        let error = error.into();
27
28        Self::Custom {
29            error,
30            help: None,
31            span: Span::call_site(),
32        }
33    }
34}
35
36impl From<syn::Error> for Error {
37    fn from(err: syn::Error) -> Self {
38        Error::Syn(err)
39    }
40}
41
42impl std::fmt::Display for Error {
43    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
44        match self {
45            Error::Syn(err) => err.fmt(f),
46            Error::Custom { error, .. } => {
47                write!(f, "a custom error: {}", error)
48            }
49        }
50    }
51}
52
53impl std::error::Error for Error {}
54
55pub fn abort(err: Error) -> ! {
56    match err {
57        Error::Syn(err) => {
58            proc_macro_error::abort! {err.span(), "{}", err}
59        }
60        Error::Custom { span, error, help } => match help {
61            Some(help) => {
62                proc_macro_error::abort! {span, "{}",  error; help="{}", help}
63            }
64            None => {
65                proc_macro_error::abort! {span, "{}",  error}
66            }
67        },
68    }
69}