1use crate::ArenaVec;
2use crate::models::data::Data;
3use crate::models::mdx::{MdxExpression, MdxJsxElement, MdxjsEsm};
4use crate::models::position::Position;
5
6#[derive(Debug, PartialEq)]
8pub enum Node<'a> {
9 Root(Root<'a>),
10 Paragraph(Paragraph<'a>),
11 Heading(Heading<'a>),
12 ThematicBreak(ThematicBreak<'a>),
13 Text(Text<'a>),
14 Emphasis(Emphasis<'a>),
15 Strong(Strong<'a>),
16 Break(Break<'a>),
17 Code(Code<'a>),
18 InlineCode(InlineCode<'a>),
19 Blockquote(Blockquote<'a>),
20 List(List<'a>),
21 ListItem(ListItem<'a>),
22 Link(Link<'a>),
23 Image(Image<'a>),
24 LinkReference(LinkReference<'a>),
25 ImageReference(ImageReference<'a>),
26 Definition(Definition<'a>),
27 Html(Html<'a>),
28 Delete(Delete<'a>),
29 Table(Table<'a>),
30 TableRow(TableRow<'a>),
31 TableCell(TableCell<'a>),
32 FootnoteDefinition(FootnoteDefinition<'a>),
33 FootnoteReference(FootnoteReference<'a>),
34 Math(Math<'a>),
35 InlineMath(InlineMath<'a>),
36 ContainerDirective(ContainerDirective<'a>),
37 LeafDirective(LeafDirective<'a>),
38 TextDirective(TextDirective<'a>),
39 Yaml(Yaml<'a>),
40 Toml(Toml<'a>),
41 Literal(Literal<'a>),
42 Unknown(Unknown<'a>),
43 DefList(DefList<'a>),
44 DefListTerm(DefListTerm<'a>),
45 DefListDescription(DefListDescription<'a>),
46 MdxJsxFlowElement(MdxJsxElement<'a, Node<'a>>),
47 MdxJsxTextElement(MdxJsxElement<'a, Node<'a>>),
48 MdxFlowExpression(MdxExpression<'a>),
49 MdxTextExpression(MdxExpression<'a>),
50 MdxjsEsm(MdxjsEsm<'a>),
51}
52
53#[derive(Debug, PartialEq)]
55pub struct Root<'a> {
56 pub children: ArenaVec<'a, Node<'a>>,
57 pub position: Option<Position<'a>>,
58 pub data: Option<&'a Data<'a>>,
60}
61
62#[derive(Debug, PartialEq)]
64pub struct Paragraph<'a> {
65 pub children: ArenaVec<'a, Node<'a>>,
66 pub position: Option<Position<'a>>,
67 pub data: Option<&'a Data<'a>>,
69}
70
71#[derive(Debug, PartialEq)]
73pub struct Heading<'a> {
74 pub depth: u8,
75 pub children: ArenaVec<'a, Node<'a>>,
76 pub position: Option<Position<'a>>,
77 pub data: Option<&'a Data<'a>>,
79}
80
81#[derive(Debug, PartialEq)]
83pub struct ThematicBreak<'a> {
84 pub position: Option<Position<'a>>,
85 pub data: Option<&'a Data<'a>>,
87}
88
89#[derive(Debug, PartialEq)]
91pub struct Emphasis<'a> {
92 pub children: ArenaVec<'a, Node<'a>>,
93 pub position: Option<Position<'a>>,
94 pub data: Option<&'a Data<'a>>,
96}
97
98#[derive(Debug, PartialEq)]
100pub struct Strong<'a> {
101 pub children: ArenaVec<'a, Node<'a>>,
102 pub position: Option<Position<'a>>,
103 pub data: Option<&'a Data<'a>>,
105}
106
107#[derive(Debug, PartialEq)]
109pub struct Break<'a> {
110 pub position: Option<Position<'a>>,
111 pub data: Option<&'a Data<'a>>,
113}
114
115#[derive(Debug, PartialEq)]
117pub struct Code<'a> {
118 pub lang: Option<&'a str>,
119 pub meta: Option<&'a str>,
120 pub value: &'a str,
121 pub position: Option<Position<'a>>,
122 pub data: Option<&'a Data<'a>>,
124}
125
126#[derive(Debug, PartialEq)]
128pub struct InlineCode<'a> {
129 pub value: &'a str,
130 pub position: Option<Position<'a>>,
131 pub data: Option<&'a Data<'a>>,
133}
134
135#[derive(Debug, PartialEq)]
137pub struct Blockquote<'a> {
138 pub children: ArenaVec<'a, Node<'a>>,
139 pub position: Option<Position<'a>>,
140 pub data: Option<&'a Data<'a>>,
142}
143
144#[derive(Debug, PartialEq)]
147pub struct List<'a> {
148 pub ordered: bool,
149 pub start: Option<u32>,
150 pub spread: Option<bool>,
151 pub children: ArenaVec<'a, Node<'a>>,
152 pub position: Option<Position<'a>>,
153 pub data: Option<&'a Data<'a>>,
155}
156
157#[derive(Debug, PartialEq)]
159pub struct ListItem<'a> {
160 pub spread: Option<bool>,
161 pub checked: Option<bool>,
162 pub children: ArenaVec<'a, Node<'a>>,
163 pub position: Option<Position<'a>>,
164 pub data: Option<&'a Data<'a>>,
166}
167
168#[derive(Debug, PartialEq)]
170pub struct Link<'a> {
171 pub url: &'a str,
172 pub title: Option<&'a str>,
173 pub children: ArenaVec<'a, Node<'a>>,
174 pub position: Option<Position<'a>>,
175 pub data: Option<&'a Data<'a>>,
177}
178
179#[derive(Debug, PartialEq)]
181pub struct Image<'a> {
182 pub url: &'a str,
183 pub title: Option<&'a str>,
184 pub alt: Option<&'a str>,
185 pub position: Option<Position<'a>>,
186 pub data: Option<&'a Data<'a>>,
188}
189
190#[derive(Clone, Copy, Debug, PartialEq, Eq)]
192pub enum ReferenceType {
193 Shortcut,
194 Collapsed,
195 Full,
196}
197
198#[derive(Debug, PartialEq)]
200pub struct LinkReference<'a> {
201 pub identifier: &'a str,
202 pub label: Option<&'a str>,
203 pub reference_type: ReferenceType,
204 pub children: ArenaVec<'a, Node<'a>>,
205 pub position: Option<Position<'a>>,
206 pub data: Option<&'a Data<'a>>,
208}
209
210#[derive(Debug, PartialEq)]
212pub struct ImageReference<'a> {
213 pub identifier: &'a str,
214 pub label: Option<&'a str>,
215 pub reference_type: ReferenceType,
216 pub alt: Option<&'a str>,
217 pub position: Option<Position<'a>>,
218 pub data: Option<&'a Data<'a>>,
220}
221
222#[derive(Debug, PartialEq)]
224pub struct Definition<'a> {
225 pub identifier: &'a str,
226 pub label: Option<&'a str>,
227 pub url: &'a str,
228 pub title: Option<&'a str>,
229 pub position: Option<Position<'a>>,
230 pub data: Option<&'a Data<'a>>,
232}
233
234impl ReferenceType {
235 pub fn as_str(self) -> &'static str {
237 match self {
238 ReferenceType::Shortcut => "shortcut",
239 ReferenceType::Collapsed => "collapsed",
240 ReferenceType::Full => "full",
241 }
242 }
243}
244
245#[derive(Debug, PartialEq)]
247pub struct Delete<'a> {
248 pub children: ArenaVec<'a, Node<'a>>,
249 pub position: Option<Position<'a>>,
250 pub data: Option<&'a Data<'a>>,
252}
253
254#[derive(Clone, Copy, Debug, PartialEq, Eq)]
256pub enum AlignKind {
257 Left,
258 Right,
259 Center,
260 None,
261}
262
263#[derive(Debug, PartialEq)]
265pub struct Table<'a> {
266 pub align: ArenaVec<'a, AlignKind>,
267 pub children: ArenaVec<'a, Node<'a>>,
268 pub position: Option<Position<'a>>,
269 pub data: Option<&'a Data<'a>>,
271}
272
273#[derive(Debug, PartialEq)]
275pub struct TableRow<'a> {
276 pub children: ArenaVec<'a, Node<'a>>,
277 pub position: Option<Position<'a>>,
278 pub data: Option<&'a Data<'a>>,
280}
281
282#[derive(Debug, PartialEq)]
284pub struct TableCell<'a> {
285 pub children: ArenaVec<'a, Node<'a>>,
286 pub position: Option<Position<'a>>,
287 pub data: Option<&'a Data<'a>>,
289}
290
291#[derive(Debug, PartialEq)]
293pub struct FootnoteDefinition<'a> {
294 pub identifier: &'a str,
295 pub label: Option<&'a str>,
296 pub children: ArenaVec<'a, Node<'a>>,
297 pub position: Option<Position<'a>>,
298 pub data: Option<&'a Data<'a>>,
300}
301
302#[derive(Debug, PartialEq)]
304pub struct FootnoteReference<'a> {
305 pub identifier: &'a str,
306 pub label: Option<&'a str>,
307 pub position: Option<Position<'a>>,
308 pub data: Option<&'a Data<'a>>,
310}
311
312#[derive(Debug, PartialEq)]
314pub struct Math<'a> {
315 pub meta: Option<&'a str>,
316 pub value: &'a str,
317 pub position: Option<Position<'a>>,
318 pub data: Option<&'a Data<'a>>,
320}
321
322#[derive(Debug, PartialEq)]
324pub struct InlineMath<'a> {
325 pub value: &'a str,
326 pub position: Option<Position<'a>>,
327 pub data: Option<&'a Data<'a>>,
329}
330
331pub type DirectiveAttributes<'a> = ArenaVec<'a, (&'a str, &'a str)>;
333
334#[derive(Debug, PartialEq)]
337pub struct ContainerDirective<'a> {
338 pub name: &'a str,
339 pub attributes: DirectiveAttributes<'a>,
340 pub label: bool,
341 pub children: ArenaVec<'a, Node<'a>>,
342 pub position: Option<Position<'a>>,
343 pub data: Option<&'a Data<'a>>,
345}
346
347#[derive(Debug, PartialEq)]
349pub struct LeafDirective<'a> {
350 pub name: &'a str,
351 pub attributes: DirectiveAttributes<'a>,
352 pub children: ArenaVec<'a, Node<'a>>,
353 pub position: Option<Position<'a>>,
354 pub data: Option<&'a Data<'a>>,
356}
357
358#[derive(Debug, PartialEq)]
360pub struct TextDirective<'a> {
361 pub name: &'a str,
362 pub attributes: DirectiveAttributes<'a>,
363 pub children: ArenaVec<'a, Node<'a>>,
364 pub position: Option<Position<'a>>,
365 pub data: Option<&'a Data<'a>>,
367}
368
369#[derive(Debug, PartialEq)]
371pub struct DefList<'a> {
372 pub children: ArenaVec<'a, Node<'a>>,
373 pub position: Option<Position<'a>>,
374 pub data: Option<&'a Data<'a>>,
376}
377
378#[derive(Debug, PartialEq)]
380pub struct DefListTerm<'a> {
381 pub children: ArenaVec<'a, Node<'a>>,
382 pub position: Option<Position<'a>>,
383 pub data: Option<&'a Data<'a>>,
385}
386
387#[derive(Debug, PartialEq)]
389pub struct DefListDescription<'a> {
390 pub spread: bool,
391 pub children: ArenaVec<'a, Node<'a>>,
392 pub position: Option<Position<'a>>,
393 pub data: Option<&'a Data<'a>>,
395}
396
397#[derive(Debug, PartialEq)]
399pub struct Html<'a> {
400 pub value: &'a str,
401 pub position: Option<Position<'a>>,
402 pub data: Option<&'a Data<'a>>,
404}
405
406#[derive(Debug, PartialEq)]
408pub struct Text<'a> {
409 pub value: &'a str,
410 pub position: Option<Position<'a>>,
411 pub data: Option<&'a Data<'a>>,
413}
414
415#[derive(Debug, PartialEq)]
417pub struct Yaml<'a> {
418 pub value: &'a str,
419 pub position: Option<Position<'a>>,
420 pub data: Option<&'a Data<'a>>,
422}
423
424#[derive(Debug, PartialEq)]
426pub struct Toml<'a> {
427 pub value: &'a str,
428 pub position: Option<Position<'a>>,
429 pub data: Option<&'a Data<'a>>,
431}
432
433#[derive(Debug, PartialEq)]
435pub struct Literal<'a> {
436 pub kind: &'a str,
438 pub value: &'a str,
439 pub position: Option<Position<'a>>,
440 pub data: Option<&'a Data<'a>>,
442}
443
444#[derive(Debug, PartialEq)]
447pub struct Unknown<'a> {
448 pub kind: &'a str,
450 pub fields: &'a [(&'a str, Data<'a>)],
452 pub children: Option<ArenaVec<'a, Node<'a>>>,
454 pub position: Option<Position<'a>>,
455 pub data: Option<&'a Data<'a>>,
457}
458
459impl<'a> Node<'a> {
460 pub fn children(&self) -> Option<&ArenaVec<'a, Node<'a>>> {
462 match self {
463 Node::Root(node) => Some(&node.children),
464 Node::Paragraph(node) => Some(&node.children),
465 Node::Heading(node) => Some(&node.children),
466 Node::Emphasis(node) => Some(&node.children),
467 Node::Strong(node) => Some(&node.children),
468 Node::Blockquote(node) => Some(&node.children),
469 Node::List(node) => Some(&node.children),
470 Node::ListItem(node) => Some(&node.children),
471 Node::Link(node) => Some(&node.children),
472 Node::LinkReference(node) => Some(&node.children),
473 Node::Delete(node) => Some(&node.children),
474 Node::Table(node) => Some(&node.children),
475 Node::TableRow(node) => Some(&node.children),
476 Node::TableCell(node) => Some(&node.children),
477 Node::FootnoteDefinition(node) => Some(&node.children),
478 Node::ContainerDirective(node) => Some(&node.children),
479 Node::LeafDirective(node) => Some(&node.children),
480 Node::TextDirective(node) => Some(&node.children),
481 Node::DefList(node) => Some(&node.children),
482 Node::DefListTerm(node) => Some(&node.children),
483 Node::DefListDescription(node) => Some(&node.children),
484 Node::Unknown(node) => node.children.as_ref(),
485 Node::MdxJsxFlowElement(node) | Node::MdxJsxTextElement(node) => {
486 Some(&node.children)
487 }
488 Node::ThematicBreak(_)
489 | Node::FootnoteReference(_)
490 | Node::Text(_)
491 | Node::Break(_)
492 | Node::Code(_)
493 | Node::InlineCode(_)
494 | Node::Image(_)
495 | Node::ImageReference(_)
496 | Node::Definition(_)
497 | Node::Html(_)
498 | Node::Math(_)
499 | Node::InlineMath(_)
500 | Node::Yaml(_)
501 | Node::Toml(_)
502 | Node::Literal(_)
503 | Node::MdxFlowExpression(_)
504 | Node::MdxTextExpression(_)
505 | Node::MdxjsEsm(_) => None,
506 }
507 }
508
509 pub fn children_mut(&mut self) -> Option<&mut ArenaVec<'a, Node<'a>>> {
511 match self {
512 Node::Root(node) => Some(&mut node.children),
513 Node::Paragraph(node) => Some(&mut node.children),
514 Node::Heading(node) => Some(&mut node.children),
515 Node::Emphasis(node) => Some(&mut node.children),
516 Node::Strong(node) => Some(&mut node.children),
517 Node::Blockquote(node) => Some(&mut node.children),
518 Node::List(node) => Some(&mut node.children),
519 Node::ListItem(node) => Some(&mut node.children),
520 Node::Link(node) => Some(&mut node.children),
521 Node::LinkReference(node) => Some(&mut node.children),
522 Node::Delete(node) => Some(&mut node.children),
523 Node::Table(node) => Some(&mut node.children),
524 Node::TableRow(node) => Some(&mut node.children),
525 Node::TableCell(node) => Some(&mut node.children),
526 Node::FootnoteDefinition(node) => Some(&mut node.children),
527 Node::ContainerDirective(node) => Some(&mut node.children),
528 Node::LeafDirective(node) => Some(&mut node.children),
529 Node::TextDirective(node) => Some(&mut node.children),
530 Node::DefList(node) => Some(&mut node.children),
531 Node::DefListTerm(node) => Some(&mut node.children),
532 Node::DefListDescription(node) => Some(&mut node.children),
533 Node::Unknown(node) => node.children.as_mut(),
534 Node::MdxJsxFlowElement(node) | Node::MdxJsxTextElement(node) => {
535 Some(&mut node.children)
536 }
537 Node::ThematicBreak(_)
538 | Node::FootnoteReference(_)
539 | Node::Text(_)
540 | Node::Break(_)
541 | Node::Code(_)
542 | Node::InlineCode(_)
543 | Node::Image(_)
544 | Node::ImageReference(_)
545 | Node::Definition(_)
546 | Node::Html(_)
547 | Node::Math(_)
548 | Node::InlineMath(_)
549 | Node::Yaml(_)
550 | Node::Toml(_)
551 | Node::Literal(_)
552 | Node::MdxFlowExpression(_)
553 | Node::MdxTextExpression(_)
554 | Node::MdxjsEsm(_) => None,
555 }
556 }
557
558 pub fn data(&self) -> Option<&'a Data<'a>> {
560 match self {
561 Node::Root(node) => node.data,
562 Node::Paragraph(node) => node.data,
563 Node::Heading(node) => node.data,
564 Node::ThematicBreak(node) => node.data,
565 Node::Text(node) => node.data,
566 Node::Emphasis(node) => node.data,
567 Node::Strong(node) => node.data,
568 Node::Break(node) => node.data,
569 Node::Code(node) => node.data,
570 Node::InlineCode(node) => node.data,
571 Node::Blockquote(node) => node.data,
572 Node::List(node) => node.data,
573 Node::ListItem(node) => node.data,
574 Node::Definition(node) => node.data,
575 Node::Html(node) => node.data,
576 Node::ImageReference(node) => node.data,
577 Node::LinkReference(node) => node.data,
578 Node::Image(node) => node.data,
579 Node::Link(node) => node.data,
580 Node::Delete(node) => node.data,
581 Node::Table(node) => node.data,
582 Node::TableRow(node) => node.data,
583 Node::TableCell(node) => node.data,
584 Node::FootnoteDefinition(node) => node.data,
585 Node::FootnoteReference(node) => node.data,
586 Node::Math(node) => node.data,
587 Node::InlineMath(node) => node.data,
588 Node::ContainerDirective(node) => node.data,
589 Node::LeafDirective(node) => node.data,
590 Node::TextDirective(node) => node.data,
591 Node::Yaml(node) => node.data,
592 Node::Toml(node) => node.data,
593 Node::Literal(node) => node.data,
594 Node::Unknown(node) => node.data,
595 Node::DefList(node) => node.data,
596 Node::DefListTerm(node) => node.data,
597 Node::DefListDescription(node) => node.data,
598 Node::MdxJsxFlowElement(node) | Node::MdxJsxTextElement(node) => node.data,
599 Node::MdxFlowExpression(node) | Node::MdxTextExpression(node) => node.data,
600 Node::MdxjsEsm(node) => node.data,
601 }
602 }
603
604 pub fn position(&self) -> Option<&Position<'a>> {
605 match self {
606 Node::Root(node) => node.position.as_ref(),
607 Node::Paragraph(node) => node.position.as_ref(),
608 Node::Heading(node) => node.position.as_ref(),
609 Node::ThematicBreak(node) => node.position.as_ref(),
610 Node::Text(node) => node.position.as_ref(),
611 Node::Emphasis(node) => node.position.as_ref(),
612 Node::Strong(node) => node.position.as_ref(),
613 Node::Break(node) => node.position.as_ref(),
614 Node::Code(node) => node.position.as_ref(),
615 Node::InlineCode(node) => node.position.as_ref(),
616 Node::Blockquote(node) => node.position.as_ref(),
617 Node::List(node) => node.position.as_ref(),
618 Node::ListItem(node) => node.position.as_ref(),
619 Node::Definition(node) => node.position.as_ref(),
620 Node::Html(node) => node.position.as_ref(),
621 Node::ImageReference(node) => node.position.as_ref(),
622 Node::LinkReference(node) => node.position.as_ref(),
623 Node::Image(node) => node.position.as_ref(),
624 Node::Link(node) => node.position.as_ref(),
625 Node::Delete(node) => node.position.as_ref(),
626 Node::Table(node) => node.position.as_ref(),
627 Node::TableRow(node) => node.position.as_ref(),
628 Node::TableCell(node) => node.position.as_ref(),
629 Node::FootnoteDefinition(node) => node.position.as_ref(),
630 Node::FootnoteReference(node) => node.position.as_ref(),
631 Node::Math(node) => node.position.as_ref(),
632 Node::InlineMath(node) => node.position.as_ref(),
633 Node::ContainerDirective(node) => node.position.as_ref(),
634 Node::LeafDirective(node) => node.position.as_ref(),
635 Node::TextDirective(node) => node.position.as_ref(),
636 Node::Yaml(node) => node.position.as_ref(),
637 Node::Toml(node) => node.position.as_ref(),
638 Node::Literal(node) => node.position.as_ref(),
639 Node::Unknown(node) => node.position.as_ref(),
640 Node::DefList(node) => node.position.as_ref(),
641 Node::DefListTerm(node) => node.position.as_ref(),
642 Node::DefListDescription(node) => node.position.as_ref(),
643 Node::MdxJsxFlowElement(node) | Node::MdxJsxTextElement(node) => {
644 node.position.as_ref()
645 }
646 Node::MdxFlowExpression(node) | Node::MdxTextExpression(node) => {
647 node.position.as_ref()
648 }
649 Node::MdxjsEsm(node) => node.position.as_ref(),
650 }
651 }
652
653 pub fn position_mut(&mut self) -> &mut Option<Position<'a>> {
654 match self {
655 Node::Root(node) => &mut node.position,
656 Node::Paragraph(node) => &mut node.position,
657 Node::Heading(node) => &mut node.position,
658 Node::ThematicBreak(node) => &mut node.position,
659 Node::Text(node) => &mut node.position,
660 Node::Emphasis(node) => &mut node.position,
661 Node::Strong(node) => &mut node.position,
662 Node::Break(node) => &mut node.position,
663 Node::Code(node) => &mut node.position,
664 Node::InlineCode(node) => &mut node.position,
665 Node::Blockquote(node) => &mut node.position,
666 Node::List(node) => &mut node.position,
667 Node::ListItem(node) => &mut node.position,
668 Node::Definition(node) => &mut node.position,
669 Node::Html(node) => &mut node.position,
670 Node::ImageReference(node) => &mut node.position,
671 Node::LinkReference(node) => &mut node.position,
672 Node::Image(node) => &mut node.position,
673 Node::Link(node) => &mut node.position,
674 Node::Delete(node) => &mut node.position,
675 Node::Table(node) => &mut node.position,
676 Node::TableRow(node) => &mut node.position,
677 Node::TableCell(node) => &mut node.position,
678 Node::FootnoteDefinition(node) => &mut node.position,
679 Node::FootnoteReference(node) => &mut node.position,
680 Node::Math(node) => &mut node.position,
681 Node::InlineMath(node) => &mut node.position,
682 Node::ContainerDirective(node) => &mut node.position,
683 Node::LeafDirective(node) => &mut node.position,
684 Node::TextDirective(node) => &mut node.position,
685 Node::Yaml(node) => &mut node.position,
686 Node::Toml(node) => &mut node.position,
687 Node::Literal(node) => &mut node.position,
688 Node::Unknown(node) => &mut node.position,
689 Node::DefList(node) => &mut node.position,
690 Node::DefListTerm(node) => &mut node.position,
691 Node::DefListDescription(node) => &mut node.position,
692 Node::MdxJsxFlowElement(node) | Node::MdxJsxTextElement(node) => {
693 &mut node.position
694 }
695 Node::MdxFlowExpression(node) | Node::MdxTextExpression(node) => {
696 &mut node.position
697 }
698 Node::MdxjsEsm(node) => &mut node.position,
699 }
700 }
701}