use proc_macro2::Span;
use syn::{Expr, Macro, MacroDelimiter};
use crate::macro_parsing::assertion::Assertion;
use quote::quote_spanned;
pub struct AssertionMacro {
pub span: Span,
pub info_args: Vec<Expr>,
pub assertion: Assertion,
}
impl AssertionMacro {
pub fn new(assrt: Assertion, span: Span, info_args: Vec<Expr>) -> Self {
Self {
assertion: assrt,
span,
info_args,
}
}
pub fn assert2ify_with(self, assert2_macro_path: syn::Path) -> Macro {
let info_args = self.info_args;
let tokens = match self.assertion {
Assertion::AssertBinary { lhs, operator, rhs } => {
quote_spanned! {self.span => #lhs #operator #rhs, #(#info_args),* }
}
Assertion::AssertUnary { expr } => {
quote_spanned! {self.span => #expr, #(#info_args),* }
}
};
Macro {
path: assert2_macro_path,
bang_token: syn::token::Bang {
spans: [self.span; 1],
},
delimiter: MacroDelimiter::Paren(syn::token::Paren { span: self.span }),
tokens,
}
}
}