rustversion_msrv/
error.rs

1use std::{fmt::Display, iter::FromIterator};
2
3use proc_macro::{Delimiter, Group, Ident, Literal, Punct, Spacing, Span, TokenStream, TokenTree};
4
5pub type Result<T, E = Error> = std::result::Result<T, E>;
6
7pub struct Error {
8    begin: Span,
9    end: Span,
10    msg: String,
11}
12
13impl Error {
14    pub fn new(span: Span, msg: impl Display) -> Self {
15        Self::new2(span, span, msg)
16    }
17
18    pub fn new2(begin: Span, end: Span, msg: impl Display) -> Self {
19        Error {
20            begin,
21            end,
22            msg: msg.to_string(),
23        }
24    }
25
26    pub fn into_compile_error(self) -> TokenStream {
27        // compile_error! { $msg }
28        TokenStream::from_iter(vec![
29            TokenTree::Ident(Ident::new("compile_error", self.begin)),
30            TokenTree::Punct({
31                let mut punct = Punct::new('!', Spacing::Alone);
32                punct.set_span(self.begin);
33                punct
34            }),
35            TokenTree::Group({
36                let mut group = Group::new(Delimiter::Brace, {
37                    TokenStream::from_iter(vec![TokenTree::Literal({
38                        let mut string = Literal::string(&self.msg);
39                        string.set_span(self.end);
40                        string
41                    })])
42                });
43                group.set_span(self.end);
44                group
45            }),
46        ])
47    }
48}