rustversion_msrv/
error.rs1use 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 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}