Move AstNode into the types crate.
Now that it is used for more than just iteration, it makes sense to promote it to the types crate.
This commit is contained in:
315
src/types/ast_node.rs
Normal file
315
src/types/ast_node.rs
Normal file
@@ -0,0 +1,315 @@
|
||||
use super::macros::to_ast_node;
|
||||
use crate::types::AngleLink;
|
||||
use crate::types::BabelCall;
|
||||
use crate::types::Bold;
|
||||
use crate::types::Citation;
|
||||
use crate::types::CitationReference;
|
||||
use crate::types::Clock;
|
||||
use crate::types::Code;
|
||||
use crate::types::Comment;
|
||||
use crate::types::CommentBlock;
|
||||
use crate::types::DiarySexp;
|
||||
use crate::types::Document;
|
||||
use crate::types::DocumentElement;
|
||||
use crate::types::Drawer;
|
||||
use crate::types::DynamicBlock;
|
||||
use crate::types::Element;
|
||||
use crate::types::Entity;
|
||||
use crate::types::ExampleBlock;
|
||||
use crate::types::ExportBlock;
|
||||
use crate::types::ExportSnippet;
|
||||
use crate::types::FixedWidthArea;
|
||||
use crate::types::FootnoteDefinition;
|
||||
use crate::types::FootnoteReference;
|
||||
use crate::types::GetStandardProperties;
|
||||
use crate::types::GreaterBlock;
|
||||
use crate::types::Heading;
|
||||
use crate::types::HorizontalRule;
|
||||
use crate::types::InlineBabelCall;
|
||||
use crate::types::InlineSourceBlock;
|
||||
use crate::types::Italic;
|
||||
use crate::types::Keyword;
|
||||
use crate::types::LatexEnvironment;
|
||||
use crate::types::LatexFragment;
|
||||
use crate::types::LineBreak;
|
||||
use crate::types::NodeProperty;
|
||||
use crate::types::Object;
|
||||
use crate::types::OrgMacro;
|
||||
use crate::types::Paragraph;
|
||||
use crate::types::PlainLink;
|
||||
use crate::types::PlainList;
|
||||
use crate::types::PlainListItem;
|
||||
use crate::types::PlainText;
|
||||
use crate::types::Planning;
|
||||
use crate::types::PropertyDrawer;
|
||||
use crate::types::RadioLink;
|
||||
use crate::types::RadioTarget;
|
||||
use crate::types::RegularLink;
|
||||
use crate::types::Section;
|
||||
use crate::types::SrcBlock;
|
||||
use crate::types::StatisticsCookie;
|
||||
use crate::types::StrikeThrough;
|
||||
use crate::types::Subscript;
|
||||
use crate::types::Superscript;
|
||||
use crate::types::Table;
|
||||
use crate::types::TableCell;
|
||||
use crate::types::TableRow;
|
||||
use crate::types::Target;
|
||||
use crate::types::Timestamp;
|
||||
use crate::types::Underline;
|
||||
use crate::types::Verbatim;
|
||||
use crate::types::VerseBlock;
|
||||
|
||||
pub enum AstNode<'r, 's> {
|
||||
// Document Nodes
|
||||
Document(&'r Document<'s>),
|
||||
Heading(&'r Heading<'s>),
|
||||
Section(&'r Section<'s>),
|
||||
// Elements
|
||||
Paragraph(&'r Paragraph<'s>),
|
||||
PlainList(&'r PlainList<'s>),
|
||||
PlainListItem(&'r PlainListItem<'s>),
|
||||
GreaterBlock(&'r GreaterBlock<'s>),
|
||||
DynamicBlock(&'r DynamicBlock<'s>),
|
||||
FootnoteDefinition(&'r FootnoteDefinition<'s>),
|
||||
Comment(&'r Comment<'s>),
|
||||
Drawer(&'r Drawer<'s>),
|
||||
PropertyDrawer(&'r PropertyDrawer<'s>),
|
||||
NodeProperty(&'r NodeProperty<'s>),
|
||||
Table(&'r Table<'s>),
|
||||
TableRow(&'r TableRow<'s>),
|
||||
VerseBlock(&'r VerseBlock<'s>),
|
||||
CommentBlock(&'r CommentBlock<'s>),
|
||||
ExampleBlock(&'r ExampleBlock<'s>),
|
||||
ExportBlock(&'r ExportBlock<'s>),
|
||||
SrcBlock(&'r SrcBlock<'s>),
|
||||
Clock(&'r Clock<'s>),
|
||||
DiarySexp(&'r DiarySexp<'s>),
|
||||
Planning(&'r Planning<'s>),
|
||||
FixedWidthArea(&'r FixedWidthArea<'s>),
|
||||
HorizontalRule(&'r HorizontalRule<'s>),
|
||||
Keyword(&'r Keyword<'s>),
|
||||
BabelCall(&'r BabelCall<'s>),
|
||||
LatexEnvironment(&'r LatexEnvironment<'s>),
|
||||
// Objects
|
||||
Bold(&'r Bold<'s>),
|
||||
Italic(&'r Italic<'s>),
|
||||
Underline(&'r Underline<'s>),
|
||||
StrikeThrough(&'r StrikeThrough<'s>),
|
||||
Code(&'r Code<'s>),
|
||||
Verbatim(&'r Verbatim<'s>),
|
||||
PlainText(&'r PlainText<'s>),
|
||||
RegularLink(&'r RegularLink<'s>),
|
||||
RadioLink(&'r RadioLink<'s>),
|
||||
RadioTarget(&'r RadioTarget<'s>),
|
||||
PlainLink(&'r PlainLink<'s>),
|
||||
AngleLink(&'r AngleLink<'s>),
|
||||
OrgMacro(&'r OrgMacro<'s>),
|
||||
Entity(&'r Entity<'s>),
|
||||
LatexFragment(&'r LatexFragment<'s>),
|
||||
ExportSnippet(&'r ExportSnippet<'s>),
|
||||
FootnoteReference(&'r FootnoteReference<'s>),
|
||||
Citation(&'r Citation<'s>),
|
||||
CitationReference(&'r CitationReference<'s>),
|
||||
InlineBabelCall(&'r InlineBabelCall<'s>),
|
||||
InlineSourceBlock(&'r InlineSourceBlock<'s>),
|
||||
LineBreak(&'r LineBreak<'s>),
|
||||
Target(&'r Target<'s>),
|
||||
StatisticsCookie(&'r StatisticsCookie<'s>),
|
||||
Subscript(&'r Subscript<'s>),
|
||||
Superscript(&'r Superscript<'s>),
|
||||
TableCell(&'r TableCell<'s>),
|
||||
Timestamp(&'r Timestamp<'s>),
|
||||
}
|
||||
|
||||
impl<'r, 's> From<&'r DocumentElement<'s>> for AstNode<'r, 's> {
|
||||
fn from(value: &'r DocumentElement<'s>) -> Self {
|
||||
match value {
|
||||
DocumentElement::Heading(inner) => inner.into(),
|
||||
DocumentElement::Section(inner) => inner.into(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<'r, 's> From<&'r Element<'s>> for AstNode<'r, 's> {
|
||||
fn from(value: &'r Element<'s>) -> Self {
|
||||
match value {
|
||||
Element::Paragraph(inner) => inner.into(),
|
||||
Element::PlainList(inner) => inner.into(),
|
||||
Element::GreaterBlock(inner) => inner.into(),
|
||||
Element::DynamicBlock(inner) => inner.into(),
|
||||
Element::FootnoteDefinition(inner) => inner.into(),
|
||||
Element::Comment(inner) => inner.into(),
|
||||
Element::Drawer(inner) => inner.into(),
|
||||
Element::PropertyDrawer(inner) => inner.into(),
|
||||
Element::Table(inner) => inner.into(),
|
||||
Element::VerseBlock(inner) => inner.into(),
|
||||
Element::CommentBlock(inner) => inner.into(),
|
||||
Element::ExampleBlock(inner) => inner.into(),
|
||||
Element::ExportBlock(inner) => inner.into(),
|
||||
Element::SrcBlock(inner) => inner.into(),
|
||||
Element::Clock(inner) => inner.into(),
|
||||
Element::DiarySexp(inner) => inner.into(),
|
||||
Element::Planning(inner) => inner.into(),
|
||||
Element::FixedWidthArea(inner) => inner.into(),
|
||||
Element::HorizontalRule(inner) => inner.into(),
|
||||
Element::Keyword(inner) => inner.into(),
|
||||
Element::BabelCall(inner) => inner.into(),
|
||||
Element::LatexEnvironment(inner) => inner.into(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<'r, 's> From<&'r Object<'s>> for AstNode<'r, 's> {
|
||||
fn from(value: &'r Object<'s>) -> Self {
|
||||
match value {
|
||||
Object::Bold(inner) => inner.into(),
|
||||
Object::Italic(inner) => inner.into(),
|
||||
Object::Underline(inner) => inner.into(),
|
||||
Object::StrikeThrough(inner) => inner.into(),
|
||||
Object::Code(inner) => inner.into(),
|
||||
Object::Verbatim(inner) => inner.into(),
|
||||
Object::PlainText(inner) => inner.into(),
|
||||
Object::RegularLink(inner) => inner.into(),
|
||||
Object::RadioLink(inner) => inner.into(),
|
||||
Object::RadioTarget(inner) => inner.into(),
|
||||
Object::PlainLink(inner) => inner.into(),
|
||||
Object::AngleLink(inner) => inner.into(),
|
||||
Object::OrgMacro(inner) => inner.into(),
|
||||
Object::Entity(inner) => inner.into(),
|
||||
Object::LatexFragment(inner) => inner.into(),
|
||||
Object::ExportSnippet(inner) => inner.into(),
|
||||
Object::FootnoteReference(inner) => inner.into(),
|
||||
Object::Citation(inner) => inner.into(),
|
||||
Object::CitationReference(inner) => inner.into(),
|
||||
Object::InlineBabelCall(inner) => inner.into(),
|
||||
Object::InlineSourceBlock(inner) => inner.into(),
|
||||
Object::LineBreak(inner) => inner.into(),
|
||||
Object::Target(inner) => inner.into(),
|
||||
Object::StatisticsCookie(inner) => inner.into(),
|
||||
Object::Subscript(inner) => inner.into(),
|
||||
Object::Superscript(inner) => inner.into(),
|
||||
Object::Timestamp(inner) => inner.into(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
to_ast_node!(&'r Document<'s>, AstNode::Document);
|
||||
to_ast_node!(&'r Heading<'s>, AstNode::Heading);
|
||||
to_ast_node!(&'r Section<'s>, AstNode::Section);
|
||||
to_ast_node!(&'r Paragraph<'s>, AstNode::Paragraph);
|
||||
to_ast_node!(&'r PlainList<'s>, AstNode::PlainList);
|
||||
to_ast_node!(&'r PlainListItem<'s>, AstNode::PlainListItem);
|
||||
to_ast_node!(&'r GreaterBlock<'s>, AstNode::GreaterBlock);
|
||||
to_ast_node!(&'r DynamicBlock<'s>, AstNode::DynamicBlock);
|
||||
to_ast_node!(&'r FootnoteDefinition<'s>, AstNode::FootnoteDefinition);
|
||||
to_ast_node!(&'r Comment<'s>, AstNode::Comment);
|
||||
to_ast_node!(&'r Drawer<'s>, AstNode::Drawer);
|
||||
to_ast_node!(&'r PropertyDrawer<'s>, AstNode::PropertyDrawer);
|
||||
to_ast_node!(&'r NodeProperty<'s>, AstNode::NodeProperty);
|
||||
to_ast_node!(&'r Table<'s>, AstNode::Table);
|
||||
to_ast_node!(&'r TableRow<'s>, AstNode::TableRow);
|
||||
to_ast_node!(&'r VerseBlock<'s>, AstNode::VerseBlock);
|
||||
to_ast_node!(&'r CommentBlock<'s>, AstNode::CommentBlock);
|
||||
to_ast_node!(&'r ExampleBlock<'s>, AstNode::ExampleBlock);
|
||||
to_ast_node!(&'r ExportBlock<'s>, AstNode::ExportBlock);
|
||||
to_ast_node!(&'r SrcBlock<'s>, AstNode::SrcBlock);
|
||||
to_ast_node!(&'r Clock<'s>, AstNode::Clock);
|
||||
to_ast_node!(&'r DiarySexp<'s>, AstNode::DiarySexp);
|
||||
to_ast_node!(&'r Planning<'s>, AstNode::Planning);
|
||||
to_ast_node!(&'r FixedWidthArea<'s>, AstNode::FixedWidthArea);
|
||||
to_ast_node!(&'r HorizontalRule<'s>, AstNode::HorizontalRule);
|
||||
to_ast_node!(&'r Keyword<'s>, AstNode::Keyword);
|
||||
to_ast_node!(&'r BabelCall<'s>, AstNode::BabelCall);
|
||||
to_ast_node!(&'r LatexEnvironment<'s>, AstNode::LatexEnvironment);
|
||||
to_ast_node!(&'r Bold<'s>, AstNode::Bold);
|
||||
to_ast_node!(&'r Italic<'s>, AstNode::Italic);
|
||||
to_ast_node!(&'r Underline<'s>, AstNode::Underline);
|
||||
to_ast_node!(&'r StrikeThrough<'s>, AstNode::StrikeThrough);
|
||||
to_ast_node!(&'r Code<'s>, AstNode::Code);
|
||||
to_ast_node!(&'r Verbatim<'s>, AstNode::Verbatim);
|
||||
to_ast_node!(&'r PlainText<'s>, AstNode::PlainText);
|
||||
to_ast_node!(&'r RegularLink<'s>, AstNode::RegularLink);
|
||||
to_ast_node!(&'r RadioLink<'s>, AstNode::RadioLink);
|
||||
to_ast_node!(&'r RadioTarget<'s>, AstNode::RadioTarget);
|
||||
to_ast_node!(&'r PlainLink<'s>, AstNode::PlainLink);
|
||||
to_ast_node!(&'r AngleLink<'s>, AstNode::AngleLink);
|
||||
to_ast_node!(&'r OrgMacro<'s>, AstNode::OrgMacro);
|
||||
to_ast_node!(&'r Entity<'s>, AstNode::Entity);
|
||||
to_ast_node!(&'r LatexFragment<'s>, AstNode::LatexFragment);
|
||||
to_ast_node!(&'r ExportSnippet<'s>, AstNode::ExportSnippet);
|
||||
to_ast_node!(&'r FootnoteReference<'s>, AstNode::FootnoteReference);
|
||||
to_ast_node!(&'r Citation<'s>, AstNode::Citation);
|
||||
to_ast_node!(&'r CitationReference<'s>, AstNode::CitationReference);
|
||||
to_ast_node!(&'r InlineBabelCall<'s>, AstNode::InlineBabelCall);
|
||||
to_ast_node!(&'r InlineSourceBlock<'s>, AstNode::InlineSourceBlock);
|
||||
to_ast_node!(&'r LineBreak<'s>, AstNode::LineBreak);
|
||||
to_ast_node!(&'r Target<'s>, AstNode::Target);
|
||||
to_ast_node!(&'r StatisticsCookie<'s>, AstNode::StatisticsCookie);
|
||||
to_ast_node!(&'r Subscript<'s>, AstNode::Subscript);
|
||||
to_ast_node!(&'r Superscript<'s>, AstNode::Superscript);
|
||||
to_ast_node!(&'r TableCell<'s>, AstNode::TableCell);
|
||||
to_ast_node!(&'r Timestamp<'s>, AstNode::Timestamp);
|
||||
|
||||
impl<'r, 's> GetStandardProperties<'s> for AstNode<'r, 's> {
|
||||
fn get_standard_properties<'b>(&'b self) -> &'b dyn crate::types::StandardProperties<'s> {
|
||||
match self {
|
||||
AstNode::Document(inner) => *inner,
|
||||
AstNode::Heading(inner) => *inner,
|
||||
AstNode::Section(inner) => *inner,
|
||||
AstNode::Paragraph(inner) => *inner,
|
||||
AstNode::PlainList(inner) => *inner,
|
||||
AstNode::PlainListItem(inner) => *inner,
|
||||
AstNode::GreaterBlock(inner) => *inner,
|
||||
AstNode::DynamicBlock(inner) => *inner,
|
||||
AstNode::FootnoteDefinition(inner) => *inner,
|
||||
AstNode::Comment(inner) => *inner,
|
||||
AstNode::Drawer(inner) => *inner,
|
||||
AstNode::PropertyDrawer(inner) => *inner,
|
||||
AstNode::NodeProperty(inner) => *inner,
|
||||
AstNode::Table(inner) => *inner,
|
||||
AstNode::TableRow(inner) => *inner,
|
||||
AstNode::VerseBlock(inner) => *inner,
|
||||
AstNode::CommentBlock(inner) => *inner,
|
||||
AstNode::ExampleBlock(inner) => *inner,
|
||||
AstNode::ExportBlock(inner) => *inner,
|
||||
AstNode::SrcBlock(inner) => *inner,
|
||||
AstNode::Clock(inner) => *inner,
|
||||
AstNode::DiarySexp(inner) => *inner,
|
||||
AstNode::Planning(inner) => *inner,
|
||||
AstNode::FixedWidthArea(inner) => *inner,
|
||||
AstNode::HorizontalRule(inner) => *inner,
|
||||
AstNode::Keyword(inner) => *inner,
|
||||
AstNode::BabelCall(inner) => *inner,
|
||||
AstNode::LatexEnvironment(inner) => *inner,
|
||||
AstNode::Bold(inner) => *inner,
|
||||
AstNode::Italic(inner) => *inner,
|
||||
AstNode::Underline(inner) => *inner,
|
||||
AstNode::StrikeThrough(inner) => *inner,
|
||||
AstNode::Code(inner) => *inner,
|
||||
AstNode::Verbatim(inner) => *inner,
|
||||
AstNode::PlainText(inner) => *inner,
|
||||
AstNode::RegularLink(inner) => *inner,
|
||||
AstNode::RadioLink(inner) => *inner,
|
||||
AstNode::RadioTarget(inner) => *inner,
|
||||
AstNode::PlainLink(inner) => *inner,
|
||||
AstNode::AngleLink(inner) => *inner,
|
||||
AstNode::OrgMacro(inner) => *inner,
|
||||
AstNode::Entity(inner) => *inner,
|
||||
AstNode::LatexFragment(inner) => *inner,
|
||||
AstNode::ExportSnippet(inner) => *inner,
|
||||
AstNode::FootnoteReference(inner) => *inner,
|
||||
AstNode::Citation(inner) => *inner,
|
||||
AstNode::CitationReference(inner) => *inner,
|
||||
AstNode::InlineBabelCall(inner) => *inner,
|
||||
AstNode::InlineSourceBlock(inner) => *inner,
|
||||
AstNode::LineBreak(inner) => *inner,
|
||||
AstNode::Target(inner) => *inner,
|
||||
AstNode::StatisticsCookie(inner) => *inner,
|
||||
AstNode::Subscript(inner) => *inner,
|
||||
AstNode::Superscript(inner) => *inner,
|
||||
AstNode::TableCell(inner) => *inner,
|
||||
AstNode::Timestamp(inner) => *inner,
|
||||
}
|
||||
}
|
||||
}
|
||||
12
src/types/macros.rs
Normal file
12
src/types/macros.rs
Normal file
@@ -0,0 +1,12 @@
|
||||
/// Write the implementation of From<> to convert a borrow of the type to an AstNode
|
||||
macro_rules! to_ast_node {
|
||||
($inp:ty, $enum:expr) => {
|
||||
impl<'r, 's> From<$inp> for AstNode<'r, 's> {
|
||||
fn from(value: $inp) -> Self {
|
||||
$enum(value)
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
pub(crate) use to_ast_node;
|
||||
@@ -1,11 +1,14 @@
|
||||
mod ast_node;
|
||||
mod document;
|
||||
mod element;
|
||||
mod get_standard_properties;
|
||||
mod greater_element;
|
||||
mod lesser_element;
|
||||
mod macros;
|
||||
mod object;
|
||||
mod source;
|
||||
mod standard_properties;
|
||||
pub(crate) use ast_node::AstNode;
|
||||
pub use document::Document;
|
||||
pub use document::DocumentElement;
|
||||
pub use document::Heading;
|
||||
|
||||
Reference in New Issue
Block a user