Remove the GetStandardProperties trait.
This was using dynamic dispatch to deal with enums to avoid the repetitive typing.
This commit is contained in:
@@ -2,6 +2,7 @@ use super::macros::to_ast_node;
|
||||
use super::CenterBlock;
|
||||
use super::QuoteBlock;
|
||||
use super::SpecialBlock;
|
||||
use super::StandardProperties;
|
||||
use crate::types::AngleLink;
|
||||
use crate::types::BabelCall;
|
||||
use crate::types::Bold;
|
||||
@@ -24,7 +25,6 @@ use crate::types::ExportSnippet;
|
||||
use crate::types::FixedWidthArea;
|
||||
use crate::types::FootnoteDefinition;
|
||||
use crate::types::FootnoteReference;
|
||||
use crate::types::GetStandardProperties;
|
||||
use crate::types::Heading;
|
||||
use crate::types::HorizontalRule;
|
||||
use crate::types::InlineBabelCall;
|
||||
@@ -259,67 +259,67 @@ 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> {
|
||||
impl<'r, 's> StandardProperties<'s> for AstNode<'r, 's> {
|
||||
fn get_source<'b>(&'b self) -> &'s str {
|
||||
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::CenterBlock(inner) => *inner,
|
||||
AstNode::QuoteBlock(inner) => *inner,
|
||||
AstNode::SpecialBlock(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,
|
||||
AstNode::Document(inner) => inner.get_source(),
|
||||
AstNode::Heading(inner) => inner.get_source(),
|
||||
AstNode::Section(inner) => inner.get_source(),
|
||||
AstNode::Paragraph(inner) => inner.get_source(),
|
||||
AstNode::PlainList(inner) => inner.get_source(),
|
||||
AstNode::PlainListItem(inner) => inner.get_source(),
|
||||
AstNode::CenterBlock(inner) => inner.get_source(),
|
||||
AstNode::QuoteBlock(inner) => inner.get_source(),
|
||||
AstNode::SpecialBlock(inner) => inner.get_source(),
|
||||
AstNode::DynamicBlock(inner) => inner.get_source(),
|
||||
AstNode::FootnoteDefinition(inner) => inner.get_source(),
|
||||
AstNode::Comment(inner) => inner.get_source(),
|
||||
AstNode::Drawer(inner) => inner.get_source(),
|
||||
AstNode::PropertyDrawer(inner) => inner.get_source(),
|
||||
AstNode::NodeProperty(inner) => inner.get_source(),
|
||||
AstNode::Table(inner) => inner.get_source(),
|
||||
AstNode::TableRow(inner) => inner.get_source(),
|
||||
AstNode::VerseBlock(inner) => inner.get_source(),
|
||||
AstNode::CommentBlock(inner) => inner.get_source(),
|
||||
AstNode::ExampleBlock(inner) => inner.get_source(),
|
||||
AstNode::ExportBlock(inner) => inner.get_source(),
|
||||
AstNode::SrcBlock(inner) => inner.get_source(),
|
||||
AstNode::Clock(inner) => inner.get_source(),
|
||||
AstNode::DiarySexp(inner) => inner.get_source(),
|
||||
AstNode::Planning(inner) => inner.get_source(),
|
||||
AstNode::FixedWidthArea(inner) => inner.get_source(),
|
||||
AstNode::HorizontalRule(inner) => inner.get_source(),
|
||||
AstNode::Keyword(inner) => inner.get_source(),
|
||||
AstNode::BabelCall(inner) => inner.get_source(),
|
||||
AstNode::LatexEnvironment(inner) => inner.get_source(),
|
||||
AstNode::Bold(inner) => inner.get_source(),
|
||||
AstNode::Italic(inner) => inner.get_source(),
|
||||
AstNode::Underline(inner) => inner.get_source(),
|
||||
AstNode::StrikeThrough(inner) => inner.get_source(),
|
||||
AstNode::Code(inner) => inner.get_source(),
|
||||
AstNode::Verbatim(inner) => inner.get_source(),
|
||||
AstNode::PlainText(inner) => inner.get_source(),
|
||||
AstNode::RegularLink(inner) => inner.get_source(),
|
||||
AstNode::RadioLink(inner) => inner.get_source(),
|
||||
AstNode::RadioTarget(inner) => inner.get_source(),
|
||||
AstNode::PlainLink(inner) => inner.get_source(),
|
||||
AstNode::AngleLink(inner) => inner.get_source(),
|
||||
AstNode::OrgMacro(inner) => inner.get_source(),
|
||||
AstNode::Entity(inner) => inner.get_source(),
|
||||
AstNode::LatexFragment(inner) => inner.get_source(),
|
||||
AstNode::ExportSnippet(inner) => inner.get_source(),
|
||||
AstNode::FootnoteReference(inner) => inner.get_source(),
|
||||
AstNode::Citation(inner) => inner.get_source(),
|
||||
AstNode::CitationReference(inner) => inner.get_source(),
|
||||
AstNode::InlineBabelCall(inner) => inner.get_source(),
|
||||
AstNode::InlineSourceBlock(inner) => inner.get_source(),
|
||||
AstNode::LineBreak(inner) => inner.get_source(),
|
||||
AstNode::Target(inner) => inner.get_source(),
|
||||
AstNode::StatisticsCookie(inner) => inner.get_source(),
|
||||
AstNode::Subscript(inner) => inner.get_source(),
|
||||
AstNode::Superscript(inner) => inner.get_source(),
|
||||
AstNode::TableCell(inner) => inner.get_source(),
|
||||
AstNode::Timestamp(inner) => inner.get_source(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
use std::path::PathBuf;
|
||||
|
||||
use super::Element;
|
||||
use super::GetStandardProperties;
|
||||
use super::NodeProperty;
|
||||
use super::Object;
|
||||
use super::StandardProperties;
|
||||
@@ -54,15 +53,6 @@ pub enum TodoKeywordType {
|
||||
Done,
|
||||
}
|
||||
|
||||
impl<'s> GetStandardProperties<'s> for DocumentElement<'s> {
|
||||
fn get_standard_properties<'b>(&'b self) -> &'b dyn StandardProperties<'s> {
|
||||
match self {
|
||||
DocumentElement::Heading(inner) => inner,
|
||||
DocumentElement::Section(inner) => inner,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<'s> StandardProperties<'s> for Document<'s> {
|
||||
fn get_source<'b>(&'b self) -> &'s str {
|
||||
self.source
|
||||
@@ -84,11 +74,7 @@ impl<'s> StandardProperties<'s> for Heading<'s> {
|
||||
impl<'s> Heading<'s> {
|
||||
pub fn get_raw_value(&self) -> String {
|
||||
// TODO: I think this could just return a string slice instead of an owned string.
|
||||
let title_source: String = self
|
||||
.title
|
||||
.iter()
|
||||
.map(|obj| obj.get_standard_properties().get_source())
|
||||
.collect();
|
||||
let title_source: String = self.title.iter().map(|obj| obj.get_source()).collect();
|
||||
title_source
|
||||
}
|
||||
|
||||
@@ -132,3 +118,12 @@ impl<'s> Document<'s> {
|
||||
.flat_map(|property_drawer| property_drawer.children.iter())
|
||||
}
|
||||
}
|
||||
|
||||
impl<'s> StandardProperties<'s> for DocumentElement<'s> {
|
||||
fn get_source<'b>(&'b self) -> &'s str {
|
||||
match self {
|
||||
DocumentElement::Heading(inner) => inner.get_source(),
|
||||
DocumentElement::Section(inner) => inner.get_source(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,7 +20,6 @@ use super::lesser_element::SrcBlock;
|
||||
use super::lesser_element::VerseBlock;
|
||||
use super::CenterBlock;
|
||||
use super::Drawer;
|
||||
use super::GetStandardProperties;
|
||||
use super::QuoteBlock;
|
||||
use super::SpecialBlock;
|
||||
use super::StandardProperties;
|
||||
@@ -54,33 +53,33 @@ pub enum Element<'s> {
|
||||
LatexEnvironment(LatexEnvironment<'s>),
|
||||
}
|
||||
|
||||
impl<'s> GetStandardProperties<'s> for Element<'s> {
|
||||
fn get_standard_properties<'b>(&'b self) -> &'b dyn StandardProperties<'s> {
|
||||
impl<'s> StandardProperties<'s> for Element<'s> {
|
||||
fn get_source<'b>(&'b self) -> &'s str {
|
||||
match self {
|
||||
Element::Paragraph(inner) => inner,
|
||||
Element::PlainList(inner) => inner,
|
||||
Element::CenterBlock(inner) => inner,
|
||||
Element::QuoteBlock(inner) => inner,
|
||||
Element::SpecialBlock(inner) => inner,
|
||||
Element::DynamicBlock(inner) => inner,
|
||||
Element::FootnoteDefinition(inner) => inner,
|
||||
Element::Comment(inner) => inner,
|
||||
Element::Drawer(inner) => inner,
|
||||
Element::PropertyDrawer(inner) => inner,
|
||||
Element::Table(inner) => inner,
|
||||
Element::VerseBlock(inner) => inner,
|
||||
Element::CommentBlock(inner) => inner,
|
||||
Element::ExampleBlock(inner) => inner,
|
||||
Element::ExportBlock(inner) => inner,
|
||||
Element::SrcBlock(inner) => inner,
|
||||
Element::Clock(inner) => inner,
|
||||
Element::DiarySexp(inner) => inner,
|
||||
Element::Planning(inner) => inner,
|
||||
Element::FixedWidthArea(inner) => inner,
|
||||
Element::HorizontalRule(inner) => inner,
|
||||
Element::Keyword(inner) => inner,
|
||||
Element::BabelCall(inner) => inner,
|
||||
Element::LatexEnvironment(inner) => inner,
|
||||
Element::Paragraph(inner) => inner.get_source(),
|
||||
Element::PlainList(inner) => inner.get_source(),
|
||||
Element::CenterBlock(inner) => inner.get_source(),
|
||||
Element::QuoteBlock(inner) => inner.get_source(),
|
||||
Element::SpecialBlock(inner) => inner.get_source(),
|
||||
Element::DynamicBlock(inner) => inner.get_source(),
|
||||
Element::FootnoteDefinition(inner) => inner.get_source(),
|
||||
Element::Comment(inner) => inner.get_source(),
|
||||
Element::Drawer(inner) => inner.get_source(),
|
||||
Element::PropertyDrawer(inner) => inner.get_source(),
|
||||
Element::Table(inner) => inner.get_source(),
|
||||
Element::VerseBlock(inner) => inner.get_source(),
|
||||
Element::CommentBlock(inner) => inner.get_source(),
|
||||
Element::ExampleBlock(inner) => inner.get_source(),
|
||||
Element::ExportBlock(inner) => inner.get_source(),
|
||||
Element::SrcBlock(inner) => inner.get_source(),
|
||||
Element::Clock(inner) => inner.get_source(),
|
||||
Element::DiarySexp(inner) => inner.get_source(),
|
||||
Element::Planning(inner) => inner.get_source(),
|
||||
Element::FixedWidthArea(inner) => inner.get_source(),
|
||||
Element::HorizontalRule(inner) => inner.get_source(),
|
||||
Element::Keyword(inner) => inner.get_source(),
|
||||
Element::BabelCall(inner) => inner.get_source(),
|
||||
Element::LatexEnvironment(inner) => inner.get_source(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
use super::StandardProperties;
|
||||
|
||||
pub trait GetStandardProperties<'s> {
|
||||
// TODO: Can I eliminate this dynamic dispatch, perhaps using nominal generic structs? Low prioritiy since this is not used during parsing.
|
||||
fn get_standard_properties<'b>(&'b self) -> &'b dyn StandardProperties<'s>;
|
||||
}
|
||||
|
||||
impl<'s, I: StandardProperties<'s>> GetStandardProperties<'s> for I {
|
||||
fn get_standard_properties<'b>(&'b self) -> &'b dyn StandardProperties<'s> {
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
pub trait NewGetStandardProperties<'s> {
|
||||
// TODO: Can I eliminate this dynamic dispatch, perhaps using nominal generic structs? Low prioritiy since this is not used during parsing.
|
||||
fn get_standard_properties(self) -> impl StandardProperties<'s>;
|
||||
}
|
||||
|
||||
impl<'s, I: StandardProperties<'s>> NewGetStandardProperties<'s> for I {
|
||||
fn get_standard_properties(self) -> impl StandardProperties<'s> {
|
||||
self
|
||||
}
|
||||
}
|
||||
@@ -2,7 +2,6 @@ mod affiliated_keyword;
|
||||
mod ast_node;
|
||||
mod document;
|
||||
mod element;
|
||||
mod get_standard_properties;
|
||||
mod greater_element;
|
||||
mod lesser_element;
|
||||
mod macros;
|
||||
@@ -22,7 +21,6 @@ pub use document::PriorityCookie;
|
||||
pub use document::Section;
|
||||
pub use document::TodoKeywordType;
|
||||
pub use element::Element;
|
||||
pub use get_standard_properties::GetStandardProperties;
|
||||
pub use greater_element::CenterBlock;
|
||||
pub use greater_element::CheckboxType;
|
||||
pub use greater_element::Drawer;
|
||||
|
||||
@@ -6,7 +6,6 @@ use super::util::coalesce_whitespace_if_line_break;
|
||||
use super::util::remove_line_break;
|
||||
use super::util::remove_whitespace_if_line_break;
|
||||
use super::util::to_lowercase;
|
||||
use super::GetStandardProperties;
|
||||
use super::StandardProperties;
|
||||
|
||||
#[derive(Debug)]
|
||||
@@ -515,40 +514,6 @@ pub struct WarningDelay {
|
||||
pub unit: TimeUnit,
|
||||
}
|
||||
|
||||
impl<'s> GetStandardProperties<'s> for Object<'s> {
|
||||
fn get_standard_properties<'b>(&'b self) -> &'b dyn StandardProperties<'s> {
|
||||
match self {
|
||||
Object::Bold(inner) => inner,
|
||||
Object::Italic(inner) => inner,
|
||||
Object::Underline(inner) => inner,
|
||||
Object::StrikeThrough(inner) => inner,
|
||||
Object::Code(inner) => inner,
|
||||
Object::Verbatim(inner) => inner,
|
||||
Object::PlainText(inner) => inner,
|
||||
Object::RegularLink(inner) => inner,
|
||||
Object::RadioLink(inner) => inner,
|
||||
Object::RadioTarget(inner) => inner,
|
||||
Object::PlainLink(inner) => inner,
|
||||
Object::AngleLink(inner) => inner,
|
||||
Object::OrgMacro(inner) => inner,
|
||||
Object::Entity(inner) => inner,
|
||||
Object::LatexFragment(inner) => inner,
|
||||
Object::ExportSnippet(inner) => inner,
|
||||
Object::FootnoteReference(inner) => inner,
|
||||
Object::Citation(inner) => inner,
|
||||
Object::CitationReference(inner) => inner,
|
||||
Object::InlineBabelCall(inner) => inner,
|
||||
Object::InlineSourceBlock(inner) => inner,
|
||||
Object::LineBreak(inner) => inner,
|
||||
Object::Target(inner) => inner,
|
||||
Object::StatisticsCookie(inner) => inner,
|
||||
Object::Subscript(inner) => inner,
|
||||
Object::Superscript(inner) => inner,
|
||||
Object::Timestamp(inner) => inner,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<'s> StandardProperties<'s> for Bold<'s> {
|
||||
fn get_source<'b>(&'b self) -> &'s str {
|
||||
self.source
|
||||
@@ -801,3 +766,37 @@ impl<'s> FootnoteReference<'s> {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<'s> StandardProperties<'s> for Object<'s> {
|
||||
fn get_source<'b>(&'b self) -> &'s str {
|
||||
match self {
|
||||
Object::Bold(inner) => inner.get_source(),
|
||||
Object::Italic(inner) => inner.get_source(),
|
||||
Object::Underline(inner) => inner.get_source(),
|
||||
Object::StrikeThrough(inner) => inner.get_source(),
|
||||
Object::Code(inner) => inner.get_source(),
|
||||
Object::Verbatim(inner) => inner.get_source(),
|
||||
Object::PlainText(inner) => inner.get_source(),
|
||||
Object::RegularLink(inner) => inner.get_source(),
|
||||
Object::RadioLink(inner) => inner.get_source(),
|
||||
Object::RadioTarget(inner) => inner.get_source(),
|
||||
Object::PlainLink(inner) => inner.get_source(),
|
||||
Object::AngleLink(inner) => inner.get_source(),
|
||||
Object::OrgMacro(inner) => inner.get_source(),
|
||||
Object::Entity(inner) => inner.get_source(),
|
||||
Object::LatexFragment(inner) => inner.get_source(),
|
||||
Object::ExportSnippet(inner) => inner.get_source(),
|
||||
Object::FootnoteReference(inner) => inner.get_source(),
|
||||
Object::Citation(inner) => inner.get_source(),
|
||||
Object::CitationReference(inner) => inner.get_source(),
|
||||
Object::InlineBabelCall(inner) => inner.get_source(),
|
||||
Object::InlineSourceBlock(inner) => inner.get_source(),
|
||||
Object::LineBreak(inner) => inner.get_source(),
|
||||
Object::Target(inner) => inner.get_source(),
|
||||
Object::StatisticsCookie(inner) => inner.get_source(),
|
||||
Object::Subscript(inner) => inner.get_source(),
|
||||
Object::Superscript(inner) => inner.get_source(),
|
||||
Object::Timestamp(inner) => inner.get_source(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user