Remove the GetStandardProperties trait.

This was using dynamic dispatch to deal with enums to avoid the repetitive typing.
This commit is contained in:
Tom Alexander 2023-10-31 21:20:39 -04:00
parent 49f6e70a19
commit bcf1b49db2
Signed by: talexander
GPG Key ID: D3A179C9A53C0EDE
14 changed files with 159 additions and 218 deletions

View File

@ -57,7 +57,6 @@ use crate::types::FixedWidthArea;
use crate::types::FootnoteDefinition; use crate::types::FootnoteDefinition;
use crate::types::FootnoteReference; use crate::types::FootnoteReference;
use crate::types::FootnoteReferenceType; use crate::types::FootnoteReferenceType;
use crate::types::GetStandardProperties;
use crate::types::Heading; use crate::types::Heading;
use crate::types::HorizontalRule; use crate::types::HorizontalRule;
use crate::types::Hour; use crate::types::Hour;
@ -413,7 +412,7 @@ pub(crate) fn compare_ast_node<'b, 's>(
name: rust.get_elisp_fact().get_elisp_name(), name: rust.get_elisp_fact().get_elisp_name(),
message: Some(e.to_string()), message: Some(e.to_string()),
children: Vec::new(), children: Vec::new(),
rust_source: rust.get_standard_properties().get_source(), rust_source: rust.get_source(),
emacs_token: emacs, emacs_token: emacs,
} }
.into() .into()

View File

@ -15,7 +15,6 @@ use crate::compare::sexp::unquote;
use crate::types::AffiliatedKeywordValue; use crate::types::AffiliatedKeywordValue;
use crate::types::AstNode; use crate::types::AstNode;
use crate::types::GetAffiliatedKeywords; use crate::types::GetAffiliatedKeywords;
use crate::types::GetStandardProperties;
use crate::types::StandardProperties; use crate::types::StandardProperties;
/// Check if the child string slice is a slice of the parent string slice. /// Check if the child string slice is a slice of the parent string slice.
@ -44,14 +43,14 @@ fn get_rust_byte_offsets<'b, 's, S: StandardProperties<'s> + ?Sized>(
pub(crate) fn compare_standard_properties< pub(crate) fn compare_standard_properties<
'b, 'b,
's, 's,
S: GetStandardProperties<'s> + GetElispFact<'s> + ?Sized, S: StandardProperties<'s> + GetElispFact<'s> + ?Sized,
>( >(
original_document: &'s str, original_document: &'s str,
emacs: &'b Token<'s>, emacs: &'b Token<'s>,
rust: &'b S, rust: &'b S,
) -> Result<(), Box<dyn std::error::Error>> { ) -> Result<(), Box<dyn std::error::Error>> {
assert_name(emacs, rust.get_elisp_fact().get_elisp_name())?; assert_name(emacs, rust.get_elisp_fact().get_elisp_name())?;
assert_bounds(original_document, emacs, rust.get_standard_properties())?; assert_bounds(original_document, emacs, rust)?;
Ok(()) Ok(())
} }

View File

@ -211,7 +211,6 @@ mod tests {
use crate::context::List; use crate::context::List;
use crate::parser::element_parser::element; use crate::parser::element_parser::element;
use crate::types::Element; use crate::types::Element;
use crate::types::GetStandardProperties;
use crate::types::StandardProperties; use crate::types::StandardProperties;
#[test] #[test]
@ -227,10 +226,7 @@ mod tests {
_ => panic!("Should be a paragraph!"), _ => panic!("Should be a paragraph!"),
}; };
assert_eq!(Into::<&str>::into(remaining), ""); assert_eq!(Into::<&str>::into(remaining), "");
assert_eq!( assert_eq!(first_paragraph.get_source(), "[cite:@foo]");
first_paragraph.get_standard_properties().get_source(),
"[cite:@foo]"
);
assert_eq!(first_paragraph.children.len(), 1); assert_eq!(first_paragraph.children.len(), 1);
match first_paragraph match first_paragraph

View File

@ -160,7 +160,7 @@ mod tests {
use crate::context::Context; use crate::context::Context;
use crate::context::GlobalSettings; use crate::context::GlobalSettings;
use crate::context::List; use crate::context::List;
use crate::types::GetStandardProperties; use crate::types::StandardProperties;
#[test] #[test]
fn two_paragraphs() { fn two_paragraphs() {
@ -181,17 +181,13 @@ line footnote.",
footnote_definition_matcher(remaining).expect("Parse second footnote_definition."); footnote_definition_matcher(remaining).expect("Parse second footnote_definition.");
assert_eq!(Into::<&str>::into(remaining), ""); assert_eq!(Into::<&str>::into(remaining), "");
assert_eq!( assert_eq!(
first_footnote_definition first_footnote_definition.get_source(),
.get_standard_properties()
.get_source(),
"[fn:1] A footnote. "[fn:1] A footnote.
" "
); );
assert_eq!( assert_eq!(
second_footnote_definition second_footnote_definition.get_source(),
.get_standard_properties()
.get_source(),
"[fn:2] A multi- "[fn:2] A multi-
line footnote." line footnote."
@ -216,9 +212,7 @@ not in the footnote.",
footnote_definition_matcher(input).expect("Parse first footnote_definition"); footnote_definition_matcher(input).expect("Parse first footnote_definition");
assert_eq!(Into::<&str>::into(remaining), "not in the footnote."); assert_eq!(Into::<&str>::into(remaining), "not in the footnote.");
assert_eq!( assert_eq!(
first_footnote_definition first_footnote_definition.get_source(),
.get_standard_properties()
.get_source(),
"[fn:2] A multi- "[fn:2] A multi-
line footnote. line footnote.

View File

@ -96,7 +96,7 @@ mod tests {
use crate::context::List; use crate::context::List;
use crate::parser::element_parser::element; use crate::parser::element_parser::element;
use crate::parser::org_source::OrgSource; use crate::parser::org_source::OrgSource;
use crate::types::GetStandardProperties; use crate::types::StandardProperties;
#[test] #[test]
fn two_paragraphs() { fn two_paragraphs() {
@ -109,13 +109,7 @@ mod tests {
let (remaining, second_paragraph) = let (remaining, second_paragraph) =
paragraph_matcher(remaining).expect("Parse second paragraph."); paragraph_matcher(remaining).expect("Parse second paragraph.");
assert_eq!(Into::<&str>::into(remaining), ""); assert_eq!(Into::<&str>::into(remaining), "");
assert_eq!( assert_eq!(first_paragraph.get_source(), "foo bar baz\n\n");
first_paragraph.get_standard_properties().get_source(), assert_eq!(second_paragraph.get_source(), "lorem ipsum");
"foo bar baz\n\n"
);
assert_eq!(
second_paragraph.get_standard_properties().get_source(),
"lorem ipsum"
);
} }
} }

View File

@ -629,7 +629,7 @@ mod tests {
use crate::context::Context; use crate::context::Context;
use crate::context::GlobalSettings; use crate::context::GlobalSettings;
use crate::context::List; use crate::context::List;
use crate::types::GetStandardProperties; use crate::types::StandardProperties;
#[test] #[test]
fn plain_list_item_empty() { fn plain_list_item_empty() {
@ -640,7 +640,7 @@ mod tests {
let plain_list_item_matcher = bind_context!(plain_list_item, &initial_context); let plain_list_item_matcher = bind_context!(plain_list_item, &initial_context);
let (remaining, (_, result)) = plain_list_item_matcher(input).unwrap(); let (remaining, (_, result)) = plain_list_item_matcher(input).unwrap();
assert_eq!(Into::<&str>::into(remaining), ""); assert_eq!(Into::<&str>::into(remaining), "");
assert_eq!(result.get_standard_properties().get_source(), "1."); assert_eq!(result.get_source(), "1.");
} }
#[test] #[test]
@ -652,7 +652,7 @@ mod tests {
let plain_list_item_matcher = bind_context!(plain_list_item, &initial_context); let plain_list_item_matcher = bind_context!(plain_list_item, &initial_context);
let (remaining, (_, result)) = plain_list_item_matcher(input).unwrap(); let (remaining, (_, result)) = plain_list_item_matcher(input).unwrap();
assert_eq!(Into::<&str>::into(remaining), ""); assert_eq!(Into::<&str>::into(remaining), "");
assert_eq!(result.get_standard_properties().get_source(), "1. foo"); assert_eq!(result.get_source(), "1. foo");
} }
#[test] #[test]
@ -664,7 +664,7 @@ mod tests {
let (remaining, result) = let (remaining, result) =
plain_list(std::iter::empty(), input, &initial_context, input).unwrap(); plain_list(std::iter::empty(), input, &initial_context, input).unwrap();
assert_eq!(Into::<&str>::into(remaining), ""); assert_eq!(Into::<&str>::into(remaining), "");
assert_eq!(result.get_standard_properties().get_source(), "1."); assert_eq!(result.get_source(), "1.");
} }
#[test] #[test]
@ -676,7 +676,7 @@ mod tests {
let (remaining, result) = let (remaining, result) =
plain_list(std::iter::empty(), input, &initial_context, input).unwrap(); plain_list(std::iter::empty(), input, &initial_context, input).unwrap();
assert_eq!(Into::<&str>::into(remaining), ""); assert_eq!(Into::<&str>::into(remaining), "");
assert_eq!(result.get_standard_properties().get_source(), "1. foo"); assert_eq!(result.get_source(), "1. foo");
} }
#[test] #[test]
@ -721,7 +721,7 @@ mod tests {
plain_list_matcher(input).expect("Should parse the plain list successfully."); plain_list_matcher(input).expect("Should parse the plain list successfully.");
assert_eq!(Into::<&str>::into(remaining), " ipsum\n"); assert_eq!(Into::<&str>::into(remaining), " ipsum\n");
assert_eq!( assert_eq!(
result.get_standard_properties().get_source(), result.get_source(),
r#"1. foo r#"1. foo
2. bar 2. bar
baz baz
@ -749,7 +749,7 @@ baz"#,
plain_list_matcher(input).expect("Should parse the plain list successfully."); plain_list_matcher(input).expect("Should parse the plain list successfully.");
assert_eq!(Into::<&str>::into(remaining), "baz"); assert_eq!(Into::<&str>::into(remaining), "baz");
assert_eq!( assert_eq!(
result.get_standard_properties().get_source(), result.get_source(),
r#"1. foo r#"1. foo
1. bar 1. bar
@ -782,7 +782,7 @@ dolar"#,
plain_list_matcher(input).expect("Should parse the plain list successfully."); plain_list_matcher(input).expect("Should parse the plain list successfully.");
assert_eq!(Into::<&str>::into(remaining), "dolar"); assert_eq!(Into::<&str>::into(remaining), "dolar");
assert_eq!( assert_eq!(
result.get_standard_properties().get_source(), result.get_source(),
r#"1. foo r#"1. foo
bar bar

View File

@ -143,7 +143,7 @@ mod tests {
use crate::context::GlobalSettings; use crate::context::GlobalSettings;
use crate::context::List; use crate::context::List;
use crate::parser::object_parser::detect_standard_set_object_sans_plain_text; use crate::parser::object_parser::detect_standard_set_object_sans_plain_text;
use crate::types::GetStandardProperties; use crate::types::StandardProperties;
#[test] #[test]
fn plain_text_simple() { fn plain_text_simple() {
@ -160,9 +160,6 @@ mod tests {
)(input) )(input)
.unwrap(); .unwrap();
assert_eq!(Into::<&str>::into(remaining), ""); assert_eq!(Into::<&str>::into(remaining), "");
assert_eq!( assert_eq!(result.get_source(), Into::<&str>::into(input));
result.get_standard_properties().get_source(),
Into::<&str>::into(input)
);
} }
} }

View File

@ -175,8 +175,8 @@ mod tests {
use crate::parser::element_parser::element; use crate::parser::element_parser::element;
use crate::types::Bold; use crate::types::Bold;
use crate::types::Element; use crate::types::Element;
use crate::types::GetStandardProperties;
use crate::types::PlainText; use crate::types::PlainText;
use crate::types::StandardProperties;
#[test] #[test]
fn plain_text_radio_target() -> Result<(), Box<dyn std::error::Error>> { fn plain_text_radio_target() -> Result<(), Box<dyn std::error::Error>> {
@ -195,10 +195,7 @@ mod tests {
_ => panic!("Should be a paragraph!"), _ => panic!("Should be a paragraph!"),
}; };
assert_eq!(Into::<&str>::into(remaining), ""); assert_eq!(Into::<&str>::into(remaining), "");
assert_eq!( assert_eq!(first_paragraph.get_source(), "foo bar baz");
first_paragraph.get_standard_properties().get_source(),
"foo bar baz"
);
assert_eq!(first_paragraph.children.len(), 3); assert_eq!(first_paragraph.children.len(), 3);
match first_paragraph match first_paragraph
.children .children
@ -206,7 +203,7 @@ mod tests {
.expect("Len already asserted to be 3.") .expect("Len already asserted to be 3.")
{ {
Object::RadioLink(inner) => { Object::RadioLink(inner) => {
assert_eq!(inner.get_standard_properties().get_source(), "bar "); assert_eq!(inner.get_source(), "bar ");
assert_eq!(inner.path, "bar"); assert_eq!(inner.path, "bar");
assert_eq!(inner.children.len(), 1); assert_eq!(inner.children.len(), 1);
let child = inner let child = inner
@ -214,7 +211,7 @@ mod tests {
.first() .first()
.expect("Length already asserted to be 1."); .expect("Length already asserted to be 1.");
assert!(matches!(child, Object::PlainText(_))); assert!(matches!(child, Object::PlainText(_)));
assert_eq!(child.get_standard_properties().get_source(), "bar"); assert_eq!(child.get_source(), "bar");
} }
_ => { _ => {
return Err("Child should be a radio link.".into()); return Err("Child should be a radio link.".into());
@ -244,10 +241,7 @@ mod tests {
_ => panic!("Should be a paragraph!"), _ => panic!("Should be a paragraph!"),
}; };
assert_eq!(Into::<&str>::into(remaining), ""); assert_eq!(Into::<&str>::into(remaining), "");
assert_eq!( assert_eq!(first_paragraph.get_source(), "foo *bar* baz");
first_paragraph.get_standard_properties().get_source(),
"foo *bar* baz"
);
assert_eq!(first_paragraph.children.len(), 3); assert_eq!(first_paragraph.children.len(), 3);
match first_paragraph match first_paragraph
.children .children
@ -255,7 +249,7 @@ mod tests {
.expect("Len already asserted to be 3.") .expect("Len already asserted to be 3.")
{ {
Object::RadioLink(inner) => { Object::RadioLink(inner) => {
assert_eq!(inner.get_standard_properties().get_source(), "*bar* "); assert_eq!(inner.get_source(), "*bar* ");
assert_eq!(inner.path, "*bar* "); assert_eq!(inner.path, "*bar* ");
assert_eq!(inner.children.len(), 1); assert_eq!(inner.children.len(), 1);
let child = inner let child = inner
@ -263,7 +257,7 @@ mod tests {
.first() .first()
.expect("Length already asserted to be 1."); .expect("Length already asserted to be 1.");
assert!(matches!(child, Object::Bold(_))); assert!(matches!(child, Object::Bold(_)));
assert_eq!(child.get_standard_properties().get_source(), "*bar* "); assert_eq!(child.get_source(), "*bar* ");
} }
_ => { _ => {
return Err("Child should be a radio link.".into()); return Err("Child should be a radio link.".into());

View File

@ -2,6 +2,7 @@ use super::macros::to_ast_node;
use super::CenterBlock; use super::CenterBlock;
use super::QuoteBlock; use super::QuoteBlock;
use super::SpecialBlock; use super::SpecialBlock;
use super::StandardProperties;
use crate::types::AngleLink; use crate::types::AngleLink;
use crate::types::BabelCall; use crate::types::BabelCall;
use crate::types::Bold; use crate::types::Bold;
@ -24,7 +25,6 @@ use crate::types::ExportSnippet;
use crate::types::FixedWidthArea; use crate::types::FixedWidthArea;
use crate::types::FootnoteDefinition; use crate::types::FootnoteDefinition;
use crate::types::FootnoteReference; use crate::types::FootnoteReference;
use crate::types::GetStandardProperties;
use crate::types::Heading; use crate::types::Heading;
use crate::types::HorizontalRule; use crate::types::HorizontalRule;
use crate::types::InlineBabelCall; 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 TableCell<'s>, AstNode::TableCell);
to_ast_node!(&'r Timestamp<'s>, AstNode::Timestamp); to_ast_node!(&'r Timestamp<'s>, AstNode::Timestamp);
impl<'r, 's> GetStandardProperties<'s> for AstNode<'r, 's> { impl<'r, 's> StandardProperties<'s> for AstNode<'r, 's> {
fn get_standard_properties<'b>(&'b self) -> &'b dyn crate::types::StandardProperties<'s> { fn get_source<'b>(&'b self) -> &'s str {
match self { match self {
AstNode::Document(inner) => *inner, AstNode::Document(inner) => inner.get_source(),
AstNode::Heading(inner) => *inner, AstNode::Heading(inner) => inner.get_source(),
AstNode::Section(inner) => *inner, AstNode::Section(inner) => inner.get_source(),
AstNode::Paragraph(inner) => *inner, AstNode::Paragraph(inner) => inner.get_source(),
AstNode::PlainList(inner) => *inner, AstNode::PlainList(inner) => inner.get_source(),
AstNode::PlainListItem(inner) => *inner, AstNode::PlainListItem(inner) => inner.get_source(),
AstNode::CenterBlock(inner) => *inner, AstNode::CenterBlock(inner) => inner.get_source(),
AstNode::QuoteBlock(inner) => *inner, AstNode::QuoteBlock(inner) => inner.get_source(),
AstNode::SpecialBlock(inner) => *inner, AstNode::SpecialBlock(inner) => inner.get_source(),
AstNode::DynamicBlock(inner) => *inner, AstNode::DynamicBlock(inner) => inner.get_source(),
AstNode::FootnoteDefinition(inner) => *inner, AstNode::FootnoteDefinition(inner) => inner.get_source(),
AstNode::Comment(inner) => *inner, AstNode::Comment(inner) => inner.get_source(),
AstNode::Drawer(inner) => *inner, AstNode::Drawer(inner) => inner.get_source(),
AstNode::PropertyDrawer(inner) => *inner, AstNode::PropertyDrawer(inner) => inner.get_source(),
AstNode::NodeProperty(inner) => *inner, AstNode::NodeProperty(inner) => inner.get_source(),
AstNode::Table(inner) => *inner, AstNode::Table(inner) => inner.get_source(),
AstNode::TableRow(inner) => *inner, AstNode::TableRow(inner) => inner.get_source(),
AstNode::VerseBlock(inner) => *inner, AstNode::VerseBlock(inner) => inner.get_source(),
AstNode::CommentBlock(inner) => *inner, AstNode::CommentBlock(inner) => inner.get_source(),
AstNode::ExampleBlock(inner) => *inner, AstNode::ExampleBlock(inner) => inner.get_source(),
AstNode::ExportBlock(inner) => *inner, AstNode::ExportBlock(inner) => inner.get_source(),
AstNode::SrcBlock(inner) => *inner, AstNode::SrcBlock(inner) => inner.get_source(),
AstNode::Clock(inner) => *inner, AstNode::Clock(inner) => inner.get_source(),
AstNode::DiarySexp(inner) => *inner, AstNode::DiarySexp(inner) => inner.get_source(),
AstNode::Planning(inner) => *inner, AstNode::Planning(inner) => inner.get_source(),
AstNode::FixedWidthArea(inner) => *inner, AstNode::FixedWidthArea(inner) => inner.get_source(),
AstNode::HorizontalRule(inner) => *inner, AstNode::HorizontalRule(inner) => inner.get_source(),
AstNode::Keyword(inner) => *inner, AstNode::Keyword(inner) => inner.get_source(),
AstNode::BabelCall(inner) => *inner, AstNode::BabelCall(inner) => inner.get_source(),
AstNode::LatexEnvironment(inner) => *inner, AstNode::LatexEnvironment(inner) => inner.get_source(),
AstNode::Bold(inner) => *inner, AstNode::Bold(inner) => inner.get_source(),
AstNode::Italic(inner) => *inner, AstNode::Italic(inner) => inner.get_source(),
AstNode::Underline(inner) => *inner, AstNode::Underline(inner) => inner.get_source(),
AstNode::StrikeThrough(inner) => *inner, AstNode::StrikeThrough(inner) => inner.get_source(),
AstNode::Code(inner) => *inner, AstNode::Code(inner) => inner.get_source(),
AstNode::Verbatim(inner) => *inner, AstNode::Verbatim(inner) => inner.get_source(),
AstNode::PlainText(inner) => *inner, AstNode::PlainText(inner) => inner.get_source(),
AstNode::RegularLink(inner) => *inner, AstNode::RegularLink(inner) => inner.get_source(),
AstNode::RadioLink(inner) => *inner, AstNode::RadioLink(inner) => inner.get_source(),
AstNode::RadioTarget(inner) => *inner, AstNode::RadioTarget(inner) => inner.get_source(),
AstNode::PlainLink(inner) => *inner, AstNode::PlainLink(inner) => inner.get_source(),
AstNode::AngleLink(inner) => *inner, AstNode::AngleLink(inner) => inner.get_source(),
AstNode::OrgMacro(inner) => *inner, AstNode::OrgMacro(inner) => inner.get_source(),
AstNode::Entity(inner) => *inner, AstNode::Entity(inner) => inner.get_source(),
AstNode::LatexFragment(inner) => *inner, AstNode::LatexFragment(inner) => inner.get_source(),
AstNode::ExportSnippet(inner) => *inner, AstNode::ExportSnippet(inner) => inner.get_source(),
AstNode::FootnoteReference(inner) => *inner, AstNode::FootnoteReference(inner) => inner.get_source(),
AstNode::Citation(inner) => *inner, AstNode::Citation(inner) => inner.get_source(),
AstNode::CitationReference(inner) => *inner, AstNode::CitationReference(inner) => inner.get_source(),
AstNode::InlineBabelCall(inner) => *inner, AstNode::InlineBabelCall(inner) => inner.get_source(),
AstNode::InlineSourceBlock(inner) => *inner, AstNode::InlineSourceBlock(inner) => inner.get_source(),
AstNode::LineBreak(inner) => *inner, AstNode::LineBreak(inner) => inner.get_source(),
AstNode::Target(inner) => *inner, AstNode::Target(inner) => inner.get_source(),
AstNode::StatisticsCookie(inner) => *inner, AstNode::StatisticsCookie(inner) => inner.get_source(),
AstNode::Subscript(inner) => *inner, AstNode::Subscript(inner) => inner.get_source(),
AstNode::Superscript(inner) => *inner, AstNode::Superscript(inner) => inner.get_source(),
AstNode::TableCell(inner) => *inner, AstNode::TableCell(inner) => inner.get_source(),
AstNode::Timestamp(inner) => *inner, AstNode::Timestamp(inner) => inner.get_source(),
} }
} }
} }

View File

@ -1,7 +1,6 @@
use std::path::PathBuf; use std::path::PathBuf;
use super::Element; use super::Element;
use super::GetStandardProperties;
use super::NodeProperty; use super::NodeProperty;
use super::Object; use super::Object;
use super::StandardProperties; use super::StandardProperties;
@ -54,15 +53,6 @@ pub enum TodoKeywordType {
Done, 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> { impl<'s> StandardProperties<'s> for Document<'s> {
fn get_source<'b>(&'b self) -> &'s str { fn get_source<'b>(&'b self) -> &'s str {
self.source self.source
@ -84,11 +74,7 @@ impl<'s> StandardProperties<'s> for Heading<'s> {
impl<'s> Heading<'s> { impl<'s> Heading<'s> {
pub fn get_raw_value(&self) -> String { pub fn get_raw_value(&self) -> String {
// TODO: I think this could just return a string slice instead of an owned string. // TODO: I think this could just return a string slice instead of an owned string.
let title_source: String = self let title_source: String = self.title.iter().map(|obj| obj.get_source()).collect();
.title
.iter()
.map(|obj| obj.get_standard_properties().get_source())
.collect();
title_source title_source
} }
@ -132,3 +118,12 @@ impl<'s> Document<'s> {
.flat_map(|property_drawer| property_drawer.children.iter()) .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(),
}
}
}

View File

@ -20,7 +20,6 @@ use super::lesser_element::SrcBlock;
use super::lesser_element::VerseBlock; use super::lesser_element::VerseBlock;
use super::CenterBlock; use super::CenterBlock;
use super::Drawer; use super::Drawer;
use super::GetStandardProperties;
use super::QuoteBlock; use super::QuoteBlock;
use super::SpecialBlock; use super::SpecialBlock;
use super::StandardProperties; use super::StandardProperties;
@ -54,33 +53,33 @@ pub enum Element<'s> {
LatexEnvironment(LatexEnvironment<'s>), LatexEnvironment(LatexEnvironment<'s>),
} }
impl<'s> GetStandardProperties<'s> for Element<'s> { impl<'s> StandardProperties<'s> for Element<'s> {
fn get_standard_properties<'b>(&'b self) -> &'b dyn StandardProperties<'s> { fn get_source<'b>(&'b self) -> &'s str {
match self { match self {
Element::Paragraph(inner) => inner, Element::Paragraph(inner) => inner.get_source(),
Element::PlainList(inner) => inner, Element::PlainList(inner) => inner.get_source(),
Element::CenterBlock(inner) => inner, Element::CenterBlock(inner) => inner.get_source(),
Element::QuoteBlock(inner) => inner, Element::QuoteBlock(inner) => inner.get_source(),
Element::SpecialBlock(inner) => inner, Element::SpecialBlock(inner) => inner.get_source(),
Element::DynamicBlock(inner) => inner, Element::DynamicBlock(inner) => inner.get_source(),
Element::FootnoteDefinition(inner) => inner, Element::FootnoteDefinition(inner) => inner.get_source(),
Element::Comment(inner) => inner, Element::Comment(inner) => inner.get_source(),
Element::Drawer(inner) => inner, Element::Drawer(inner) => inner.get_source(),
Element::PropertyDrawer(inner) => inner, Element::PropertyDrawer(inner) => inner.get_source(),
Element::Table(inner) => inner, Element::Table(inner) => inner.get_source(),
Element::VerseBlock(inner) => inner, Element::VerseBlock(inner) => inner.get_source(),
Element::CommentBlock(inner) => inner, Element::CommentBlock(inner) => inner.get_source(),
Element::ExampleBlock(inner) => inner, Element::ExampleBlock(inner) => inner.get_source(),
Element::ExportBlock(inner) => inner, Element::ExportBlock(inner) => inner.get_source(),
Element::SrcBlock(inner) => inner, Element::SrcBlock(inner) => inner.get_source(),
Element::Clock(inner) => inner, Element::Clock(inner) => inner.get_source(),
Element::DiarySexp(inner) => inner, Element::DiarySexp(inner) => inner.get_source(),
Element::Planning(inner) => inner, Element::Planning(inner) => inner.get_source(),
Element::FixedWidthArea(inner) => inner, Element::FixedWidthArea(inner) => inner.get_source(),
Element::HorizontalRule(inner) => inner, Element::HorizontalRule(inner) => inner.get_source(),
Element::Keyword(inner) => inner, Element::Keyword(inner) => inner.get_source(),
Element::BabelCall(inner) => inner, Element::BabelCall(inner) => inner.get_source(),
Element::LatexEnvironment(inner) => inner, Element::LatexEnvironment(inner) => inner.get_source(),
} }
} }
} }

View File

@ -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
}
}

View File

@ -2,7 +2,6 @@ mod affiliated_keyword;
mod ast_node; mod ast_node;
mod document; mod document;
mod element; mod element;
mod get_standard_properties;
mod greater_element; mod greater_element;
mod lesser_element; mod lesser_element;
mod macros; mod macros;
@ -22,7 +21,6 @@ pub use document::PriorityCookie;
pub use document::Section; pub use document::Section;
pub use document::TodoKeywordType; pub use document::TodoKeywordType;
pub use element::Element; pub use element::Element;
pub use get_standard_properties::GetStandardProperties;
pub use greater_element::CenterBlock; pub use greater_element::CenterBlock;
pub use greater_element::CheckboxType; pub use greater_element::CheckboxType;
pub use greater_element::Drawer; pub use greater_element::Drawer;

View File

@ -6,7 +6,6 @@ use super::util::coalesce_whitespace_if_line_break;
use super::util::remove_line_break; use super::util::remove_line_break;
use super::util::remove_whitespace_if_line_break; use super::util::remove_whitespace_if_line_break;
use super::util::to_lowercase; use super::util::to_lowercase;
use super::GetStandardProperties;
use super::StandardProperties; use super::StandardProperties;
#[derive(Debug)] #[derive(Debug)]
@ -515,40 +514,6 @@ pub struct WarningDelay {
pub unit: TimeUnit, 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> { impl<'s> StandardProperties<'s> for Bold<'s> {
fn get_source<'b>(&'b self) -> &'s str { fn get_source<'b>(&'b self) -> &'s str {
self.source 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(),
}
}
}