tracelogging_macros 0.1.0

TraceLogging for Rust Proc Macros
Documentation
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.

use proc_macro::*;
use std::vec;

pub struct Errors {
    error_tokens: Vec<TokenTree>,
}

impl Errors {
    pub const fn new() -> Self {
        return Self {
            error_tokens: Vec::new(),
        };
    }

    pub fn is_empty(&self) -> bool {
        return self.error_tokens.is_empty();
    }

    pub fn drain(&mut self) -> vec::Drain<TokenTree> {
        return self.error_tokens.drain(..);
    }

    pub fn add(&mut self, pos: Span, error_message: &str) {
        if !self.error_tokens.is_empty() {
            self.add_token(pos, Punct::new(';', Spacing::Alone));
        }

        self.add_token(pos, Punct::new(':', Spacing::Joint));
        self.add_token(pos, Punct::new(':', Spacing::Alone));
        self.add_token(pos, Ident::new("core", pos));
        self.add_token(pos, Punct::new(':', Spacing::Joint));
        self.add_token(pos, Punct::new(':', Spacing::Alone));
        self.add_token(pos, Ident::new("compile_error", pos));
        self.add_token(pos, Punct::new('!', Spacing::Alone));
        self.add_token(
            pos,
            Group::new(
                Delimiter::Parenthesis,
                TokenStream::from_iter([TokenTree::Literal(Literal::string(error_message))]),
            ),
        );
    }

    fn add_token(&mut self, pos: Span, token: impl Into<TokenTree>) {
        let mut tree = token.into();
        tree.set_span(pos);
        self.error_tokens.push(tree);
    }
}