error.rs - source
Description: Source of the Rust file `/Users/erlendbasso/.cargo/registry/src/github.com-1ecc6299db9ec823/paste-1.0.11/src/error.rs`.
Keywords: rust, rustlang, rust-lang

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47

    use proc_macro::{Delimiter, Group, Ident, Literal, Punct, Spacing, Span, TokenStream, TokenTree};
    use std::iter::FromIterator;

    pub type Result<T> = std::result::Result<T, Error>;

    pub struct Error {
        begin: Span,
        end: Span,
        msg: String,
    }

    impl Error {
        pub fn new(span: Span, msg: &str) -> Self {
            Self::new2(span, span, msg)
        }

        pub fn new2(begin: Span, end: Span, msg: &str) -> Self {
            Error {
                begin,
                end,
                msg: msg.to_owned(),
            }
        }

        pub fn to_compile_error(&self) -> TokenStream {
            // compile_error! { $msg }
            TokenStream::from_iter(vec![
                TokenTree::Ident(Ident::new("compile_error", self.begin)),
                TokenTree::Punct({
                    let mut punct = Punct::new('!', Spacing::Alone);
                    punct.set_span(self.begin);
                    punct
                }),
                TokenTree::Group({
                    let mut group = Group::new(Delimiter::Brace, {
                        TokenStream::from_iter(vec![TokenTree::Literal({
                            let mut string = Literal::string(&self.msg);
                            string.set_span(self.end);
                            string
                        })])
                    });
                    group.set_span(self.end);
                    group
                }),
            ])
        }
    }