use crate::prelude::*;
use syn::visit_mut;
use syn::visit_mut::VisitMut;
pub struct RsxFileVisitor<'a> {
parser: &'a mut ParseRsx,
macros: Vec<RstmlToRsx>,
errors: Vec<syn::Error>,
}
pub struct RsxFileVisitorOut {
pub macros: Vec<RstmlToRsx>,
pub errors: Vec<syn::Error>,
}
impl<'a> Into<RsxFileVisitorOut> for RsxFileVisitor<'a> {
fn into(self) -> RsxFileVisitorOut {
RsxFileVisitorOut {
macros: self.macros,
errors: self.errors,
}
}
}
impl<'a> RsxFileVisitor<'a> {
pub fn new(parser: &'a mut ParseRsx) -> Self {
Self {
parser,
macros: Vec::new(),
errors: Vec::new(),
}
}
pub fn extend_result(
&mut self,
result: Result<RsxFileVisitorOut, syn::Error>,
) {
match result {
Ok(out) => {
self.macros.extend(out.macros);
self.errors.extend(out.errors);
}
Err(e) => self.errors.push(e),
}
}
}
impl<'a> VisitMut for RsxFileVisitor<'a> {
fn visit_macro_mut(&mut self, item: &mut syn::Macro) {
if self.parser.path_matches(&item.path) {
let parts = self.parser.parse_rsx(&mut item.tokens);
self.macros.push(parts);
item.path = syn::parse_quote!(sweet::noop)
}
visit_mut::visit_macro_mut(self, item);
}
}