Remove the GetStandardProperties trait.
This was using dynamic dispatch to deal with enums to avoid the repetitive typing.
This commit is contained in:
		
							parent
							
								
									49f6e70a19
								
							
						
					
					
						commit
						bcf1b49db2
					
				| @ -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() | ||||
|  | ||||
| @ -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<dyn std::error::Error>> { | ||||
|     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(()) | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
| @ -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. | ||||
|  | ||||
| @ -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"); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
| @ -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)); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -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<dyn std::error::Error>> { | ||||
| @ -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()); | ||||
|  | ||||
| @ -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(), | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Tom Alexander
						Tom Alexander