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}