use crate::ast::*;
pub trait Visitor {
fn visit_document(&mut self, doc: &Document) {
self.walk_document(doc);
}
fn visit_block(&mut self, block: &Block) {
self.walk_block(block);
}
fn visit_inline(&mut self, inline: &Inline) {
self.walk_inline(inline);
}
fn visit_table_cell(&mut self, cell: &TableCell) {
self.walk_table_cell(cell);
}
fn visit_list_item(&mut self, item: &ListItem) {
self.walk_list_item(item);
}
fn visit_table_row(&mut self, row: &TableRow) {
self.walk_table_row(row);
}
fn visit_heading(&mut self, heading: &Heading) {
self.walk_heading(heading);
}
fn visit_link(&mut self, link: &Link) {
self.walk_link(link);
}
fn visit_image(&mut self, image: &Image) {
self.walk_image(image);
}
fn visit_code_block(&mut self, code_block: &CodeBlock) {
self.walk_code_block(code_block);
}
fn visit_text(&mut self, text: &str) {
self.walk_text(text);
}
fn visit_footnote_definition(&mut self, footnote: &FootnoteDefinition) {
self.walk_footnote_definition(footnote);
}
fn visit_github_alert(&mut self, alert: &GitHubAlert) {
self.walk_github_alert(alert);
}
fn walk_document(&mut self, doc: &Document) {
for block in &doc.blocks {
self.visit_block(block);
}
}
fn walk_block(&mut self, block: &Block) {
match block {
Block::Paragraph(inlines) => {
for inline in inlines {
self.visit_inline(inline);
}
}
Block::Heading(heading) => {
self.visit_heading(heading);
}
Block::BlockQuote(blocks) => {
for block in blocks {
self.visit_block(block);
}
}
Block::List(list) => {
for item in &list.items {
self.visit_list_item(item);
}
}
Block::Table(table) => {
for row in &table.rows {
self.visit_table_row(row);
}
}
Block::FootnoteDefinition(footnote) => {
self.visit_footnote_definition(footnote);
}
Block::GitHubAlert(alert) => {
self.visit_github_alert(alert);
}
Block::Definition(def) => {
for inline in &def.label {
self.visit_inline(inline);
}
}
Block::CodeBlock(code_block) => {
self.visit_code_block(code_block);
}
Block::ThematicBreak | Block::HtmlBlock(_) | Block::Empty => {}
}
}
fn walk_inline(&mut self, inline: &Inline) {
match inline {
Inline::Emphasis(inlines)
| Inline::Strong(inlines)
| Inline::Strikethrough(inlines) => {
for inline in inlines {
self.visit_inline(inline);
}
}
Inline::Link(link) => {
self.visit_link(link);
}
Inline::LinkReference(link_ref) => {
for inline in &link_ref.label {
self.visit_inline(inline);
}
for inline in &link_ref.text {
self.visit_inline(inline);
}
}
Inline::Image(image) => {
self.visit_image(image);
}
Inline::Text(text) => {
self.visit_text(text);
}
Inline::LineBreak
| Inline::Code(_)
| Inline::Html(_)
| Inline::Autolink(_)
| Inline::FootnoteReference(_)
| Inline::Empty => {}
}
}
fn walk_table_cell(&mut self, cell: &TableCell) {
for inline in cell {
self.visit_inline(inline);
}
}
fn walk_list_item(&mut self, item: &ListItem) {
for block in &item.blocks {
self.visit_block(block);
}
}
fn walk_table_row(&mut self, row: &TableRow) {
for cell in row {
self.visit_table_cell(cell);
}
}
fn walk_heading(&mut self, heading: &Heading) {
for inline in &heading.content {
self.visit_inline(inline);
}
}
fn walk_link(&mut self, link: &Link) {
for inline in &link.children {
self.visit_inline(inline);
}
}
fn walk_image(&mut self, _image: &Image) {
}
fn walk_code_block(&mut self, _code_block: &CodeBlock) {
}
fn walk_text(&mut self, _text: &str) {
}
fn walk_footnote_definition(&mut self, footnote: &FootnoteDefinition) {
for block in &footnote.blocks {
self.visit_block(block);
}
}
fn walk_github_alert(&mut self, alert: &GitHubAlert) {
for block in &alert.blocks {
self.visit_block(block);
}
}
}
pub trait VisitWith {
fn visit_with<V: Visitor>(&self, visitor: &mut V);
}
impl VisitWith for Document {
fn visit_with<V: Visitor>(&self, visitor: &mut V) {
visitor.visit_document(self);
}
}
impl VisitWith for Block {
fn visit_with<V: Visitor>(&self, visitor: &mut V) {
visitor.visit_block(self);
}
}
impl VisitWith for Inline {
fn visit_with<V: Visitor>(&self, visitor: &mut V) {
visitor.visit_inline(self);
}
}