From bcf1b49db2dc704f0f8366319e2caa3566c4f1ea Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Tue, 31 Oct 2023 21:20:39 -0400 Subject: [PATCH] Remove the GetStandardProperties trait. This was using dynamic dispatch to deal with enums to avoid the repetitive typing. --- src/compare/diff.rs | 3 +- src/compare/util.rs | 5 +- src/parser/citation.rs | 6 +- src/parser/footnote_definition.rs | 14 +-- src/parser/paragraph.rs | 12 +-- src/parser/plain_list.rs | 16 ++-- src/parser/plain_text.rs | 7 +- src/parser/radio_link.rs | 20 ++--- src/types/ast_node.rs | 122 +++++++++++++-------------- src/types/document.rs | 25 +++--- src/types/element.rs | 53 ++++++------ src/types/get_standard_properties.rs | 23 ----- src/types/mod.rs | 2 - src/types/object.rs | 69 ++++++++------- 14 files changed, 159 insertions(+), 218 deletions(-) delete mode 100644 src/types/get_standard_properties.rs diff --git a/src/compare/diff.rs b/src/compare/diff.rs index 0dbf851..3b7a382 100644 --- a/src/compare/diff.rs +++ b/src/compare/diff.rs @@ -57,7 +57,6 @@ use crate::types::FixedWidthArea; use crate::types::FootnoteDefinition; use crate::types::FootnoteReference; use crate::types::FootnoteReferenceType; -use crate::types::GetStandardProperties; use crate::types::Heading; use crate::types::HorizontalRule; use crate::types::Hour; @@ -413,7 +412,7 @@ pub(crate) fn compare_ast_node<'b, 's>( name: rust.get_elisp_fact().get_elisp_name(), message: Some(e.to_string()), children: Vec::new(), - rust_source: rust.get_standard_properties().get_source(), + rust_source: rust.get_source(), emacs_token: emacs, } .into() diff --git a/src/compare/util.rs b/src/compare/util.rs index b7c09fb..61eb97f 100644 --- a/src/compare/util.rs +++ b/src/compare/util.rs @@ -15,7 +15,6 @@ use crate::compare::sexp::unquote; use crate::types::AffiliatedKeywordValue; use crate::types::AstNode; use crate::types::GetAffiliatedKeywords; -use crate::types::GetStandardProperties; use crate::types::StandardProperties; /// 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< 'b, 's, - S: GetStandardProperties<'s> + GetElispFact<'s> + ?Sized, + S: StandardProperties<'s> + GetElispFact<'s> + ?Sized, >( original_document: &'s str, emacs: &'b Token<'s>, rust: &'b S, ) -> Result<(), Box> { 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(()) } diff --git a/src/parser/citation.rs b/src/parser/citation.rs index e7f7afe..69d7c62 100644 --- a/src/parser/citation.rs +++ b/src/parser/citation.rs @@ -211,7 +211,6 @@ mod tests { use crate::context::List; use crate::parser::element_parser::element; use crate::types::Element; - use crate::types::GetStandardProperties; use crate::types::StandardProperties; #[test] @@ -227,10 +226,7 @@ mod tests { _ => panic!("Should be a paragraph!"), }; assert_eq!(Into::<&str>::into(remaining), ""); - assert_eq!( - first_paragraph.get_standard_properties().get_source(), - "[cite:@foo]" - ); + assert_eq!(first_paragraph.get_source(), "[cite:@foo]"); assert_eq!(first_paragraph.children.len(), 1); match first_paragraph diff --git a/src/parser/footnote_definition.rs b/src/parser/footnote_definition.rs index e263c17..e378006 100644 --- a/src/parser/footnote_definition.rs +++ b/src/parser/footnote_definition.rs @@ -160,7 +160,7 @@ mod tests { use crate::context::Context; use crate::context::GlobalSettings; use crate::context::List; - use crate::types::GetStandardProperties; + use crate::types::StandardProperties; #[test] fn two_paragraphs() { @@ -181,17 +181,13 @@ line footnote.", footnote_definition_matcher(remaining).expect("Parse second footnote_definition."); assert_eq!(Into::<&str>::into(remaining), ""); assert_eq!( - first_footnote_definition - .get_standard_properties() - .get_source(), + first_footnote_definition.get_source(), "[fn:1] A footnote. " ); assert_eq!( - second_footnote_definition - .get_standard_properties() - .get_source(), + second_footnote_definition.get_source(), "[fn:2] A multi- line footnote." @@ -216,9 +212,7 @@ not in the footnote.", footnote_definition_matcher(input).expect("Parse first footnote_definition"); assert_eq!(Into::<&str>::into(remaining), "not in the footnote."); assert_eq!( - first_footnote_definition - .get_standard_properties() - .get_source(), + first_footnote_definition.get_source(), "[fn:2] A multi- line footnote. diff --git a/src/parser/paragraph.rs b/src/parser/paragraph.rs index 077e54b..d20f943 100644 --- a/src/parser/paragraph.rs +++ b/src/parser/paragraph.rs @@ -96,7 +96,7 @@ mod tests { use crate::context::List; use crate::parser::element_parser::element; use crate::parser::org_source::OrgSource; - use crate::types::GetStandardProperties; + use crate::types::StandardProperties; #[test] fn two_paragraphs() { @@ -109,13 +109,7 @@ mod tests { let (remaining, second_paragraph) = paragraph_matcher(remaining).expect("Parse second paragraph."); assert_eq!(Into::<&str>::into(remaining), ""); - assert_eq!( - first_paragraph.get_standard_properties().get_source(), - "foo bar baz\n\n" - ); - assert_eq!( - second_paragraph.get_standard_properties().get_source(), - "lorem ipsum" - ); + assert_eq!(first_paragraph.get_source(), "foo bar baz\n\n"); + assert_eq!(second_paragraph.get_source(), "lorem ipsum"); } } diff --git a/src/parser/plain_list.rs b/src/parser/plain_list.rs index 91aeceb..b42ce1b 100644 --- a/src/parser/plain_list.rs +++ b/src/parser/plain_list.rs @@ -629,7 +629,7 @@ mod tests { use crate::context::Context; use crate::context::GlobalSettings; use crate::context::List; - use crate::types::GetStandardProperties; + use crate::types::StandardProperties; #[test] fn plain_list_item_empty() { @@ -640,7 +640,7 @@ mod tests { let plain_list_item_matcher = bind_context!(plain_list_item, &initial_context); let (remaining, (_, result)) = plain_list_item_matcher(input).unwrap(); assert_eq!(Into::<&str>::into(remaining), ""); - assert_eq!(result.get_standard_properties().get_source(), "1."); + assert_eq!(result.get_source(), "1."); } #[test] @@ -652,7 +652,7 @@ mod tests { let plain_list_item_matcher = bind_context!(plain_list_item, &initial_context); let (remaining, (_, result)) = plain_list_item_matcher(input).unwrap(); assert_eq!(Into::<&str>::into(remaining), ""); - assert_eq!(result.get_standard_properties().get_source(), "1. foo"); + assert_eq!(result.get_source(), "1. foo"); } #[test] @@ -664,7 +664,7 @@ mod tests { let (remaining, result) = plain_list(std::iter::empty(), input, &initial_context, input).unwrap(); assert_eq!(Into::<&str>::into(remaining), ""); - assert_eq!(result.get_standard_properties().get_source(), "1."); + assert_eq!(result.get_source(), "1."); } #[test] @@ -676,7 +676,7 @@ mod tests { let (remaining, result) = plain_list(std::iter::empty(), input, &initial_context, input).unwrap(); assert_eq!(Into::<&str>::into(remaining), ""); - assert_eq!(result.get_standard_properties().get_source(), "1. foo"); + assert_eq!(result.get_source(), "1. foo"); } #[test] @@ -721,7 +721,7 @@ mod tests { plain_list_matcher(input).expect("Should parse the plain list successfully."); assert_eq!(Into::<&str>::into(remaining), " ipsum\n"); assert_eq!( - result.get_standard_properties().get_source(), + result.get_source(), r#"1. foo 2. bar baz @@ -749,7 +749,7 @@ baz"#, plain_list_matcher(input).expect("Should parse the plain list successfully."); assert_eq!(Into::<&str>::into(remaining), "baz"); assert_eq!( - result.get_standard_properties().get_source(), + result.get_source(), r#"1. foo 1. bar @@ -782,7 +782,7 @@ dolar"#, plain_list_matcher(input).expect("Should parse the plain list successfully."); assert_eq!(Into::<&str>::into(remaining), "dolar"); assert_eq!( - result.get_standard_properties().get_source(), + result.get_source(), r#"1. foo bar diff --git a/src/parser/plain_text.rs b/src/parser/plain_text.rs index 2558182..24858bd 100644 --- a/src/parser/plain_text.rs +++ b/src/parser/plain_text.rs @@ -143,7 +143,7 @@ mod tests { use crate::context::GlobalSettings; use crate::context::List; use crate::parser::object_parser::detect_standard_set_object_sans_plain_text; - use crate::types::GetStandardProperties; + use crate::types::StandardProperties; #[test] fn plain_text_simple() { @@ -160,9 +160,6 @@ mod tests { )(input) .unwrap(); assert_eq!(Into::<&str>::into(remaining), ""); - assert_eq!( - result.get_standard_properties().get_source(), - Into::<&str>::into(input) - ); + assert_eq!(result.get_source(), Into::<&str>::into(input)); } } diff --git a/src/parser/radio_link.rs b/src/parser/radio_link.rs index dbe8dff..903d64e 100644 --- a/src/parser/radio_link.rs +++ b/src/parser/radio_link.rs @@ -175,8 +175,8 @@ mod tests { use crate::parser::element_parser::element; use crate::types::Bold; use crate::types::Element; - use crate::types::GetStandardProperties; use crate::types::PlainText; + use crate::types::StandardProperties; #[test] fn plain_text_radio_target() -> Result<(), Box> { @@ -195,10 +195,7 @@ mod tests { _ => panic!("Should be a paragraph!"), }; assert_eq!(Into::<&str>::into(remaining), ""); - assert_eq!( - first_paragraph.get_standard_properties().get_source(), - "foo bar baz" - ); + assert_eq!(first_paragraph.get_source(), "foo bar baz"); assert_eq!(first_paragraph.children.len(), 3); match first_paragraph .children @@ -206,7 +203,7 @@ mod tests { .expect("Len already asserted to be 3.") { 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.children.len(), 1); let child = inner @@ -214,7 +211,7 @@ mod tests { .first() .expect("Length already asserted to be 1."); 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()); @@ -244,10 +241,7 @@ mod tests { _ => panic!("Should be a paragraph!"), }; assert_eq!(Into::<&str>::into(remaining), ""); - assert_eq!( - first_paragraph.get_standard_properties().get_source(), - "foo *bar* baz" - ); + assert_eq!(first_paragraph.get_source(), "foo *bar* baz"); assert_eq!(first_paragraph.children.len(), 3); match first_paragraph .children @@ -255,7 +249,7 @@ mod tests { .expect("Len already asserted to be 3.") { 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.children.len(), 1); let child = inner @@ -263,7 +257,7 @@ mod tests { .first() .expect("Length already asserted to be 1."); 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()); diff --git a/src/types/ast_node.rs b/src/types/ast_node.rs index c9a1729..026931a 100644 --- a/src/types/ast_node.rs +++ b/src/types/ast_node.rs @@ -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(), } } } diff --git a/src/types/document.rs b/src/types/document.rs index e6f128c..8328b72 100644 --- a/src/types/document.rs +++ b/src/types/document.rs @@ -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(), + } + } +} diff --git a/src/types/element.rs b/src/types/element.rs index 19e7ca9..c079f6b 100644 --- a/src/types/element.rs +++ b/src/types/element.rs @@ -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(), } } } diff --git a/src/types/get_standard_properties.rs b/src/types/get_standard_properties.rs deleted file mode 100644 index 9ffe0fb..0000000 --- a/src/types/get_standard_properties.rs +++ /dev/null @@ -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 - } -} diff --git a/src/types/mod.rs b/src/types/mod.rs index 334dd2f..7dad80b 100644 --- a/src/types/mod.rs +++ b/src/types/mod.rs @@ -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; diff --git a/src/types/object.rs b/src/types/object.rs index f900ccb..9f38eb6 100644 --- a/src/types/object.rs +++ b/src/types/object.rs @@ -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(), + } + } +}