use crate::ast::*;
pub trait Visit<'a> {
fn visit_document(&mut self, document: &Document<'a>) {
walk_document(self, document);
}
fn visit_node(&mut self, node: &Node<'a>) {
walk_node(self, node);
}
fn visit_paragraph(&mut self, paragraph: &Paragraph<'a>) {
walk_paragraph(self, paragraph);
}
fn visit_heading(&mut self, heading: &Heading<'a>) {
walk_heading(self, heading);
}
fn visit_thematic_break(&mut self, _thematic_break: &ThematicBreak) {}
fn visit_block_quote(&mut self, block_quote: &BlockQuote<'a>) {
walk_block_quote(self, block_quote);
}
fn visit_list(&mut self, list: &List<'a>) {
walk_list(self, list);
}
fn visit_list_item(&mut self, list_item: &ListItem<'a>) {
walk_list_item(self, list_item);
}
fn visit_code_block(&mut self, _code_block: &CodeBlock<'a>) {}
fn visit_html(&mut self, _html: &Html<'a>) {}
fn visit_table(&mut self, table: &Table<'a>) {
walk_table(self, table);
}
fn visit_table_row(&mut self, table_row: &TableRow<'a>) {
walk_table_row(self, table_row);
}
fn visit_table_cell(&mut self, table_cell: &TableCell<'a>) {
walk_table_cell(self, table_cell);
}
fn visit_text(&mut self, _text: &Text<'a>) {}
fn visit_emphasis(&mut self, emphasis: &Emphasis<'a>) {
walk_emphasis(self, emphasis);
}
fn visit_strong(&mut self, strong: &Strong<'a>) {
walk_strong(self, strong);
}
fn visit_inline_code(&mut self, _inline_code: &InlineCode<'a>) {}
fn visit_break(&mut self, _break_node: &Break) {}
fn visit_link(&mut self, link: &Link<'a>) {
walk_link(self, link);
}
fn visit_image(&mut self, _image: &Image<'a>) {}
fn visit_delete(&mut self, delete: &Delete<'a>) {
walk_delete(self, delete);
}
fn visit_footnote_reference(&mut self, _footnote_ref: &FootnoteReference<'a>) {}
fn visit_definition(&mut self, _definition: &Definition<'a>) {}
fn visit_footnote_definition(&mut self, footnote_def: &FootnoteDefinition<'a>) {
walk_footnote_definition(self, footnote_def);
}
}
pub fn walk_document<'a, V: Visit<'a> + ?Sized>(visitor: &mut V, document: &Document<'a>) {
for child in &document.children {
visitor.visit_node(child);
}
}
pub fn walk_node<'a, V: Visit<'a> + ?Sized>(visitor: &mut V, node: &Node<'a>) {
match node {
Node::Paragraph(n) => visitor.visit_paragraph(n),
Node::Heading(n) => visitor.visit_heading(n),
Node::ThematicBreak(n) => visitor.visit_thematic_break(n),
Node::BlockQuote(n) => visitor.visit_block_quote(n),
Node::List(n) => visitor.visit_list(n),
Node::ListItem(n) => visitor.visit_list_item(n),
Node::CodeBlock(n) => visitor.visit_code_block(n),
Node::Html(n) => visitor.visit_html(n),
Node::Table(n) => visitor.visit_table(n),
Node::Text(n) => visitor.visit_text(n),
Node::Emphasis(n) => visitor.visit_emphasis(n),
Node::Strong(n) => visitor.visit_strong(n),
Node::InlineCode(n) => visitor.visit_inline_code(n),
Node::Break(n) => visitor.visit_break(n),
Node::Link(n) => visitor.visit_link(n),
Node::Image(n) => visitor.visit_image(n),
Node::Delete(n) => visitor.visit_delete(n),
Node::FootnoteReference(n) => visitor.visit_footnote_reference(n),
Node::Definition(n) => visitor.visit_definition(n),
Node::FootnoteDefinition(n) => visitor.visit_footnote_definition(n),
}
}
pub fn walk_paragraph<'a, V: Visit<'a> + ?Sized>(visitor: &mut V, paragraph: &Paragraph<'a>) {
for child in ¶graph.children {
visitor.visit_node(child);
}
}
pub fn walk_heading<'a, V: Visit<'a> + ?Sized>(visitor: &mut V, heading: &Heading<'a>) {
for child in &heading.children {
visitor.visit_node(child);
}
}
pub fn walk_block_quote<'a, V: Visit<'a> + ?Sized>(visitor: &mut V, block_quote: &BlockQuote<'a>) {
for child in &block_quote.children {
visitor.visit_node(child);
}
}
pub fn walk_list<'a, V: Visit<'a> + ?Sized>(visitor: &mut V, list: &List<'a>) {
for child in &list.children {
visitor.visit_list_item(child);
}
}
pub fn walk_list_item<'a, V: Visit<'a> + ?Sized>(visitor: &mut V, list_item: &ListItem<'a>) {
for child in &list_item.children {
visitor.visit_node(child);
}
}
pub fn walk_table<'a, V: Visit<'a> + ?Sized>(visitor: &mut V, table: &Table<'a>) {
for row in &table.children {
visitor.visit_table_row(row);
}
}
pub fn walk_table_row<'a, V: Visit<'a> + ?Sized>(visitor: &mut V, table_row: &TableRow<'a>) {
for cell in &table_row.children {
visitor.visit_table_cell(cell);
}
}
pub fn walk_table_cell<'a, V: Visit<'a> + ?Sized>(visitor: &mut V, table_cell: &TableCell<'a>) {
for child in &table_cell.children {
visitor.visit_node(child);
}
}
pub fn walk_emphasis<'a, V: Visit<'a> + ?Sized>(visitor: &mut V, emphasis: &Emphasis<'a>) {
for child in &emphasis.children {
visitor.visit_node(child);
}
}
pub fn walk_strong<'a, V: Visit<'a> + ?Sized>(visitor: &mut V, strong: &Strong<'a>) {
for child in &strong.children {
visitor.visit_node(child);
}
}
pub fn walk_link<'a, V: Visit<'a> + ?Sized>(visitor: &mut V, link: &Link<'a>) {
for child in &link.children {
visitor.visit_node(child);
}
}
pub fn walk_delete<'a, V: Visit<'a> + ?Sized>(visitor: &mut V, delete: &Delete<'a>) {
for child in &delete.children {
visitor.visit_node(child);
}
}
pub fn walk_footnote_definition<'a, V: Visit<'a> + ?Sized>(
visitor: &mut V,
footnote_def: &FootnoteDefinition<'a>,
) {
for child in &footnote_def.children {
visitor.visit_node(child);
}
}