paste/
error.rs

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