pulldown_cmark_ast/
visit_mut.rs

1// ouch my wrists...
2
3use pulldown_cmark::{
4    Alignment, BlockQuoteKind, CodeBlockKind, CowStr, HeadingLevel, LinkType, MetadataBlockKind,
5    Tag,
6};
7
8use crate::{Ast, Group, Span, Spanned, Tree};
9
10pub trait VisitMut<'a> {
11    fn visit_ast_mut(&mut self, node: &mut Ast<'a>) {
12        visit_ast_mut(self, node)
13    }
14    fn visit_tree_mut(&mut self, node: &mut Tree<'a>) {
15        visit_tree_mut(self, node)
16    }
17    fn visit_text_mut(&mut self, node: &mut Spanned<CowStr<'a>>) {
18        visit_text_mut(self, node)
19    }
20    fn visit_cow_str_mut(&mut self, node: &mut CowStr<'a>) {
21        visit_cow_str_mut(self, node)
22    }
23    fn visit_code_mut(&mut self, node: &mut Spanned<CowStr<'a>>) {
24        visit_code_mut(self, node);
25    }
26    fn visit_html_mut(&mut self, node: &mut Spanned<CowStr<'a>>) {
27        visit_html_mut(self, node)
28    }
29    fn visit_inline_html_mut(&mut self, node: &mut Spanned<CowStr<'a>>) {
30        visit_inline_html_mut(self, node)
31    }
32    fn visit_footnote_reference_mut(&mut self, node: &mut Spanned<CowStr<'a>>) {
33        visit_footnote_reference_mut(self, node)
34    }
35    fn visit_task_list_marker_mut(&mut self, node: &mut Spanned<bool>) {
36        visit_task_list_marker_mut(self, node)
37    }
38    fn visit_inline_math_mut(&mut self, node: &mut Spanned<CowStr<'a>>) {
39        visit_inline_math_mut(self, node)
40    }
41    fn visit_display_math_mut(&mut self, node: &mut Spanned<CowStr<'a>>) {
42        visit_display_math_mut(self, node)
43    }
44    fn visit_soft_break_mut(&mut self, node: &mut Span) {
45        visit_soft_break_mut(self, node)
46    }
47    fn visit_hard_break_mut(&mut self, node: &mut Span) {
48        visit_hard_break_mut(self, node)
49    }
50    fn visit_rule_mut(&mut self, node: &mut Span) {
51        visit_rule_mut(self, node)
52    }
53    fn visit_group_mut(&mut self, node: &mut Group<'a>) {
54        visit_group_mut(self, node)
55    }
56
57    fn visit_strikethrough_mut(
58        &mut self,
59        stream: &mut Ast<'a>,
60        begin_span: &mut Span,
61        end_span: &mut Span,
62    ) {
63        visit_strikethrough_mut(self, stream, begin_span, end_span)
64    }
65
66    fn visit_strong_mut(
67        &mut self,
68        stream: &mut Ast<'a>,
69        begin_span: &mut Span,
70        end_span: &mut Span,
71    ) {
72        visit_strong_mut(self, stream, begin_span, end_span)
73    }
74
75    fn visit_emphasis_mut(
76        &mut self,
77        stream: &mut Ast<'a>,
78        begin_span: &mut Span,
79        end_span: &mut Span,
80    ) {
81        visit_emphasis_mut(self, stream, begin_span, end_span)
82    }
83
84    fn visit_table_cell_mut(
85        &mut self,
86        stream: &mut Ast<'a>,
87        begin_span: &mut Span,
88        end_span: &mut Span,
89    ) {
90        visit_table_cell_mut(self, stream, begin_span, end_span)
91    }
92
93    fn visit_table_row_mut(
94        &mut self,
95        stream: &mut Ast<'a>,
96        begin_span: &mut Span,
97        end_span: &mut Span,
98    ) {
99        visit_table_row_mut(self, stream, begin_span, end_span)
100    }
101
102    fn visit_table_head_mut(
103        &mut self,
104        stream: &mut Ast<'a>,
105        begin_span: &mut Span,
106        end_span: &mut Span,
107    ) {
108        visit_table_head_mut(self, stream, begin_span, end_span)
109    }
110
111    fn visit_table_mut(
112        &mut self,
113        node: &mut Vec<Alignment>,
114        stream: &mut Ast<'a>,
115        begin_span: &mut Span,
116        end_span: &mut Span,
117    ) {
118        visit_table_mut(self, node, stream, begin_span, end_span)
119    }
120
121    fn visit_footnote_definition_mut(
122        &mut self,
123        node: &mut CowStr<'a>,
124        stream: &mut Ast<'a>,
125        begin_span: &mut Span,
126        end_span: &mut Span,
127    ) {
128        visit_footnote_definition_mut(self, node, stream, begin_span, end_span)
129    }
130
131    fn visit_list_mut(
132        &mut self,
133        node: &mut Option<u64>,
134        stream: &mut Ast<'a>,
135        begin_span: &mut Span,
136        end_span: &mut Span,
137    ) {
138        visit_list_mut(self, node, stream, begin_span, end_span)
139    }
140
141    fn visit_code_block_mut(
142        &mut self,
143        node: &mut CodeBlockKind,
144        stream: &mut Ast<'a>,
145        begin_span: &mut Span,
146        end_span: &mut Span,
147    ) {
148        visit_code_block_mut(self, node, stream, begin_span, end_span)
149    }
150
151    fn visit_block_quote_mut(
152        &mut self,
153        node: &mut Option<BlockQuoteKind>,
154        stream: &mut Ast<'a>,
155        begin_span: &mut Span,
156        end_span: &mut Span,
157    ) {
158        visit_block_quote_mut(self, node, stream, begin_span, end_span)
159    }
160
161    #[allow(clippy::too_many_arguments)]
162    fn visit_heading_mut(
163        &mut self,
164        level: &mut HeadingLevel,
165        id: &mut Option<CowStr<'a>>,
166        classes: &mut Vec<CowStr<'a>>,
167        attrs: &mut Vec<(CowStr<'a>, Option<CowStr<'a>>)>,
168        stream: &mut Ast<'a>,
169        begin_span: &mut Span,
170        end_span: &mut Span,
171    ) {
172        visit_heading_mut(
173            self, level, id, classes, attrs, stream, begin_span, end_span,
174        )
175    }
176
177    fn visit_html_block_mut(
178        &mut self,
179        stream: &mut Ast<'a>,
180        begin_span: &mut Span,
181        end_span: &mut Span,
182    ) {
183        visit_html_block_mut(self, stream, begin_span, end_span)
184    }
185    fn visit_paragraph_mut(
186        &mut self,
187        stream: &mut Ast<'a>,
188        begin_span: &mut Span,
189        end_span: &mut Span,
190    ) {
191        visit_paragraph_mut(self, stream, begin_span, end_span)
192    }
193
194    fn visit_item_mut(&mut self, stream: &mut Ast<'a>, begin_span: &mut Span, end_span: &mut Span) {
195        visit_item_mut(self, stream, begin_span, end_span)
196    }
197
198    fn visit_metadata_block_mut(&mut self, node: &mut MetadataBlockKind) {
199        visit_metadata_block_mut(self, node)
200    }
201
202    fn visit_image_mut(
203        &mut self,
204        link_type: &mut LinkType,
205        dest_url: &mut CowStr<'a>,
206        title: &mut CowStr<'a>,
207        id: &mut CowStr<'a>,
208    ) {
209        visit_image_mut(self, link_type, dest_url, title, id)
210    }
211
212    fn visit_link_mut(
213        &mut self,
214        link_type: &mut LinkType,
215        dest_url: &mut CowStr<'a>,
216        title: &mut CowStr<'a>,
217        id: &mut CowStr<'a>,
218    ) {
219        visit_link_mut(self, link_type, dest_url, title, id)
220    }
221}
222
223pub fn visit_group_mut<'a, V: VisitMut<'a> + ?Sized>(v: &mut V, node: &mut Group<'a>) {
224    let Group {
225        tag: Spanned {
226            item: tag,
227            span: begin_span,
228        },
229        stream,
230        end_span,
231    } = node;
232
233    match tag {
234        Tag::Paragraph => v.visit_paragraph_mut(stream, begin_span, end_span),
235        Tag::Heading {
236            level,
237            id,
238            classes,
239            attrs,
240        } => v.visit_heading_mut(level, id, classes, attrs, stream, begin_span, end_span),
241        Tag::BlockQuote(node) => v.visit_block_quote_mut(node, stream, begin_span, end_span),
242        Tag::CodeBlock(node) => v.visit_code_block_mut(node, stream, begin_span, end_span),
243        Tag::HtmlBlock => v.visit_html_block_mut(stream, begin_span, end_span),
244        Tag::List(node) => v.visit_list_mut(node, stream, begin_span, end_span),
245        Tag::Item => v.visit_item_mut(stream, begin_span, end_span),
246        Tag::FootnoteDefinition(node) => {
247            v.visit_footnote_definition_mut(node, stream, begin_span, end_span)
248        }
249        Tag::Table(node) => v.visit_table_mut(node, stream, begin_span, end_span),
250        Tag::TableHead => v.visit_table_head_mut(stream, begin_span, end_span),
251        Tag::TableRow => v.visit_table_row_mut(stream, begin_span, end_span),
252        Tag::TableCell => v.visit_table_cell_mut(stream, begin_span, end_span),
253        Tag::Emphasis => v.visit_emphasis_mut(stream, begin_span, end_span),
254        Tag::Strong => v.visit_strong_mut(stream, begin_span, end_span),
255        Tag::Strikethrough => v.visit_strikethrough_mut(stream, begin_span, end_span),
256        Tag::Link {
257            link_type,
258            dest_url,
259            title,
260            id,
261        } => visit_link_mut(v, link_type, dest_url, title, id),
262        Tag::Image {
263            link_type,
264            dest_url,
265            title,
266            id,
267        } => visit_image_mut(v, link_type, dest_url, title, id),
268        Tag::MetadataBlock(node) => visit_metadata_block_mut(v, node),
269    }
270}
271
272fn visit_metadata_block_mut<'a, V: VisitMut<'a> + ?Sized>(v: &mut V, node: &mut MetadataBlockKind) {
273    let _ = v;
274    let _ = node;
275}
276
277fn visit_image_mut<'a, V: VisitMut<'a> + ?Sized>(
278    v: &mut V,
279    link_type: &mut LinkType,
280    dest_url: &mut CowStr<'a>,
281    title: &mut CowStr<'a>,
282    id: &mut CowStr<'a>,
283) {
284    let _ = link_type;
285    v.visit_cow_str_mut(dest_url);
286    v.visit_cow_str_mut(title);
287    v.visit_cow_str_mut(id);
288}
289
290fn visit_link_mut<'a, V: VisitMut<'a> + ?Sized>(
291    v: &mut V,
292    link_type: &mut LinkType,
293    dest_url: &mut CowStr<'a>,
294    title: &mut CowStr<'a>,
295    id: &mut CowStr<'a>,
296) {
297    let _ = link_type;
298    v.visit_cow_str_mut(dest_url);
299    v.visit_cow_str_mut(title);
300    v.visit_cow_str_mut(id);
301}
302
303fn visit_strikethrough_mut<'a, V: VisitMut<'a> + ?Sized>(
304    v: &mut V,
305    stream: &mut Ast<'a>,
306    begin_span: &mut Span,
307    end_span: &mut Span,
308) {
309    let _ = begin_span;
310    let _ = end_span;
311    v.visit_ast_mut(stream)
312}
313
314fn visit_strong_mut<'a, V: VisitMut<'a> + ?Sized>(
315    v: &mut V,
316    stream: &mut Ast<'a>,
317    begin_span: &mut Span,
318    end_span: &mut Span,
319) {
320    let _ = begin_span;
321    let _ = end_span;
322    v.visit_ast_mut(stream)
323}
324
325fn visit_emphasis_mut<'a, V: VisitMut<'a> + ?Sized>(
326    v: &mut V,
327    stream: &mut Ast<'a>,
328    begin_span: &mut Span,
329    end_span: &mut Span,
330) {
331    let _ = begin_span;
332    let _ = end_span;
333    v.visit_ast_mut(stream)
334}
335
336fn visit_table_cell_mut<'a, V: VisitMut<'a> + ?Sized>(
337    v: &mut V,
338    stream: &mut Ast<'a>,
339    begin_span: &mut Span,
340    end_span: &mut Span,
341) {
342    let _ = begin_span;
343    let _ = end_span;
344    v.visit_ast_mut(stream)
345}
346
347fn visit_table_row_mut<'a, V: VisitMut<'a> + ?Sized>(
348    v: &mut V,
349    stream: &mut Ast<'a>,
350    begin_span: &mut Span,
351    end_span: &mut Span,
352) {
353    let _ = begin_span;
354    let _ = end_span;
355    v.visit_ast_mut(stream)
356}
357
358fn visit_table_head_mut<'a, V: VisitMut<'a> + ?Sized>(
359    v: &mut V,
360    stream: &mut Ast<'a>,
361    begin_span: &mut Span,
362    end_span: &mut Span,
363) {
364    let _ = begin_span;
365    let _ = end_span;
366    v.visit_ast_mut(stream)
367}
368
369fn visit_table_mut<'a, V: VisitMut<'a> + ?Sized>(
370    v: &mut V,
371    node: &mut Vec<Alignment>,
372    stream: &mut Ast<'a>,
373    begin_span: &mut Span,
374    end_span: &mut Span,
375) {
376    let _ = begin_span;
377    let _ = end_span;
378    let _ = node;
379    v.visit_ast_mut(stream)
380}
381
382fn visit_footnote_definition_mut<'a, V: VisitMut<'a> + ?Sized>(
383    v: &mut V,
384    node: &mut CowStr<'a>,
385    stream: &mut Ast<'a>,
386    begin_span: &mut Span,
387    end_span: &mut Span,
388) {
389    let _ = begin_span;
390    let _ = end_span;
391    v.visit_cow_str_mut(node);
392    v.visit_ast_mut(stream)
393}
394
395fn visit_item_mut<'a, V: VisitMut<'a> + ?Sized>(
396    v: &mut V,
397    stream: &mut Ast<'a>,
398    begin_span: &mut Span,
399    end_span: &mut Span,
400) {
401    let _ = begin_span;
402    let _ = end_span;
403    v.visit_ast_mut(stream)
404}
405
406fn visit_list_mut<'a, V: VisitMut<'a> + ?Sized>(
407    v: &mut V,
408    node: &mut Option<u64>,
409    stream: &mut Ast<'a>,
410    begin_span: &mut Span,
411    end_span: &mut Span,
412) {
413    let _ = begin_span;
414    let _ = end_span;
415    let _ = node;
416    v.visit_ast_mut(stream)
417}
418
419fn visit_html_block_mut<'a, V: VisitMut<'a> + ?Sized>(
420    v: &mut V,
421    stream: &mut Ast<'a>,
422    begin_span: &mut Span,
423    end_span: &mut Span,
424) {
425    let _ = begin_span;
426    let _ = end_span;
427    v.visit_ast_mut(stream)
428}
429
430fn visit_code_block_mut<'a, V: VisitMut<'a> + ?Sized>(
431    v: &mut V,
432    node: &mut CodeBlockKind,
433    stream: &mut Ast<'a>,
434    begin_span: &mut Span,
435    end_span: &mut Span,
436) {
437    let _ = begin_span;
438    let _ = end_span;
439    let _ = node;
440    v.visit_ast_mut(stream)
441}
442
443fn visit_block_quote_mut<'a, V: VisitMut<'a> + ?Sized>(
444    v: &mut V,
445    node: &mut Option<BlockQuoteKind>,
446    stream: &mut Ast<'a>,
447    begin_span: &mut Span,
448    end_span: &mut Span,
449) {
450    let _ = begin_span;
451    let _ = end_span;
452    let _ = node;
453    v.visit_ast_mut(stream)
454}
455
456#[allow(clippy::too_many_arguments)]
457fn visit_heading_mut<'a, V: VisitMut<'a> + ?Sized>(
458    v: &mut V,
459    level: &mut HeadingLevel,
460    id: &mut Option<CowStr<'a>>,
461    classes: &mut Vec<CowStr<'a>>,
462    attrs: &mut Vec<(CowStr<'a>, Option<CowStr<'a>>)>,
463    stream: &mut Ast<'a>,
464    begin_span: &mut Span,
465    end_span: &mut Span,
466) {
467    let _ = begin_span;
468    let _ = end_span;
469    let _ = level;
470    let _ = id;
471    let _ = classes;
472    let _ = attrs;
473    v.visit_ast_mut(stream)
474}
475
476fn visit_paragraph_mut<'a, V: VisitMut<'a> + ?Sized>(
477    v: &mut V,
478    stream: &mut Ast<'a>,
479    begin_span: &mut Span,
480    end_span: &mut Span,
481) {
482    let _ = begin_span;
483    let _ = end_span;
484    v.visit_ast_mut(stream)
485}
486
487pub fn visit_code_mut<'a, V: VisitMut<'a> + ?Sized>(v: &mut V, node: &mut Spanned<CowStr<'a>>) {
488    v.visit_cow_str_mut(&mut node.item)
489}
490
491pub fn visit_ast_mut<'a, V: VisitMut<'a> + ?Sized>(v: &mut V, node: &mut Ast<'a>) {
492    let Ast(trees) = node;
493    for tree in trees {
494        v.visit_tree_mut(tree)
495    }
496}
497pub fn visit_html_mut<'a, V: VisitMut<'a> + ?Sized>(v: &mut V, node: &mut Spanned<CowStr<'a>>) {
498    v.visit_cow_str_mut(&mut node.item)
499}
500pub fn visit_inline_html_mut<'a, V: VisitMut<'a> + ?Sized>(
501    v: &mut V,
502    node: &mut Spanned<CowStr<'a>>,
503) {
504    v.visit_cow_str_mut(&mut node.item)
505}
506pub fn visit_footnote_reference_mut<'a, V: VisitMut<'a> + ?Sized>(
507    v: &mut V,
508    node: &mut Spanned<CowStr<'a>>,
509) {
510    v.visit_cow_str_mut(&mut node.item)
511}
512pub fn visit_task_list_marker_mut<'a, V: VisitMut<'a> + ?Sized>(
513    v: &mut V,
514    node: &mut Spanned<bool>,
515) {
516    let _ = v;
517    let _ = node;
518}
519pub fn visit_inline_math_mut<'a, V: VisitMut<'a> + ?Sized>(
520    v: &mut V,
521    node: &mut Spanned<CowStr<'a>>,
522) {
523    v.visit_cow_str_mut(&mut node.item)
524}
525pub fn visit_display_math_mut<'a, V: VisitMut<'a> + ?Sized>(
526    v: &mut V,
527    node: &mut Spanned<CowStr<'a>>,
528) {
529    v.visit_cow_str_mut(&mut node.item)
530}
531
532pub fn visit_soft_break_mut<'a, V: VisitMut<'a> + ?Sized>(v: &mut V, node: &mut Span) {
533    let _ = v;
534    let _ = node;
535}
536pub fn visit_hard_break_mut<'a, V: VisitMut<'a> + ?Sized>(v: &mut V, node: &mut Span) {
537    let _ = v;
538    let _ = node;
539}
540pub fn visit_rule_mut<'a, V: VisitMut<'a> + ?Sized>(v: &mut V, node: &mut Span) {
541    let _ = v;
542    let _ = node;
543}
544
545pub fn visit_tree_mut<'a, V: VisitMut<'a> + ?Sized>(v: &mut V, node: &mut Tree<'a>) {
546    match node {
547        Tree::Group(node) => v.visit_group_mut(node),
548        Tree::Text(node) => v.visit_text_mut(node),
549        Tree::Code(node) => v.visit_code_mut(node),
550        Tree::Html(node) => v.visit_html_mut(node),
551        Tree::InlineHtml(node) => v.visit_inline_html_mut(node),
552        Tree::FootnoteReference(node) => v.visit_footnote_reference_mut(node),
553        Tree::TaskListMarker(node) => v.visit_task_list_marker_mut(node),
554        Tree::InlineMath(node) => v.visit_inline_math_mut(node),
555        Tree::DisplayMath(node) => v.visit_display_math_mut(node),
556        Tree::SoftBreak(node) => v.visit_soft_break_mut(node),
557        Tree::HardBreak(node) => v.visit_hard_break_mut(node),
558        Tree::Rule(node) => v.visit_rule_mut(node),
559    }
560}
561pub fn visit_text_mut<'a, V: VisitMut<'a> + ?Sized>(v: &mut V, node: &mut Spanned<CowStr<'a>>) {
562    v.visit_cow_str_mut(&mut node.item)
563}
564pub fn visit_cow_str_mut<'a, V: VisitMut<'a> + ?Sized>(v: &mut V, node: &mut CowStr<'a>) {
565    let _ = v;
566    let _ = node;
567}