xref: /openbmc/qemu/rust/qemu-api-macros/src/utils.rs (revision 09360a048bd7a133e47cb8dea617d44540bdebbd)
1*a3b620ffSPaolo Bonzini // Procedural macro utilities.
2*a3b620ffSPaolo Bonzini // Author(s): Paolo Bonzini <pbonzini@redhat.com>
3*a3b620ffSPaolo Bonzini // SPDX-License-Identifier: GPL-2.0-or-later
4*a3b620ffSPaolo Bonzini 
5*a3b620ffSPaolo Bonzini use proc_macro2::Span;
6*a3b620ffSPaolo Bonzini use quote::quote_spanned;
7*a3b620ffSPaolo Bonzini 
8*a3b620ffSPaolo Bonzini pub enum MacroError {
9*a3b620ffSPaolo Bonzini     Message(String, Span),
10*a3b620ffSPaolo Bonzini     ParseError(syn::Error),
11*a3b620ffSPaolo Bonzini }
12*a3b620ffSPaolo Bonzini 
13*a3b620ffSPaolo Bonzini impl From<syn::Error> for MacroError {
from(err: syn::Error) -> Self14*a3b620ffSPaolo Bonzini     fn from(err: syn::Error) -> Self {
15*a3b620ffSPaolo Bonzini         MacroError::ParseError(err)
16*a3b620ffSPaolo Bonzini     }
17*a3b620ffSPaolo Bonzini }
18*a3b620ffSPaolo Bonzini 
19*a3b620ffSPaolo Bonzini impl From<MacroError> for proc_macro2::TokenStream {
from(err: MacroError) -> Self20*a3b620ffSPaolo Bonzini     fn from(err: MacroError) -> Self {
21*a3b620ffSPaolo Bonzini         match err {
22*a3b620ffSPaolo Bonzini             MacroError::Message(msg, span) => quote_spanned! { span => compile_error!(#msg); },
23*a3b620ffSPaolo Bonzini             MacroError::ParseError(err) => err.into_compile_error(),
24*a3b620ffSPaolo Bonzini         }
25*a3b620ffSPaolo Bonzini     }
26*a3b620ffSPaolo Bonzini }
27