use proc_macro2::TokenStream as TokenStream2;
use quote::quote_spanned;
use unsynn::*;
operator! {
Arrow = "=>";
}
unsynn! {
struct SpannedErrorInput {
span_tokens: BraceGroup,
_arrow: Arrow,
message: LiteralString,
}
}
pub fn spanned_error(input: TokenStream2) -> TokenStream2 {
let mut iter = input.to_token_iter();
let parsed: SpannedErrorInput = match iter.parse() {
Ok(i) => i,
Err(e) => {
let msg = e.to_string();
return quote::quote! { compile_error!(#msg); };
}
};
let message = parsed.message.value();
let span = parsed
.span_tokens
.0
.stream()
.into_iter()
.next()
.map(|t| t.span())
.unwrap_or_else(proc_macro2::Span::call_site);
quote_spanned! { span =>
compile_error!(#message)
}
}