diff --git a/src/intermediate/document_element.rs b/src/intermediate/document_element.rs index 205ae5a..b79220b 100644 --- a/src/intermediate/document_element.rs +++ b/src/intermediate/document_element.rs @@ -1,3 +1,4 @@ +use super::macros::iitem; use super::macros::iselector; use super::registry::Registry; use super::IHeading; @@ -15,13 +16,19 @@ iselector!( IDocumentElement, DocumentElement, |registry, original| async { - match &original { - organic::types::DocumentElement::Heading(inner) => Ok(IDocumentElement::Heading( - IHeading::new(registry, inner).await?, - )), - organic::types::DocumentElement::Section(inner) => Ok(IDocumentElement::Section( - ISection::new(registry, inner).await?, - )), - } + iitem!( + registry, + original, + ( + organic::types::DocumentElement::Heading, + IDocumentElement::Heading, + IHeading + ), + ( + organic::types::DocumentElement::Section, + IDocumentElement::Section, + ISection + ), + ) } ); diff --git a/src/intermediate/element.rs b/src/intermediate/element.rs index 40771d6..da1b173 100644 --- a/src/intermediate/element.rs +++ b/src/intermediate/element.rs @@ -15,7 +15,6 @@ use super::IFixedWidthArea; use super::IFootnoteDefinition; use super::IHorizontalRule; use super::ILatexEnvironment; -use super::IObject; use super::IParagraph; use super::IPlainList; use super::IPlanning; @@ -26,6 +25,7 @@ use super::ISrcBlock; use super::ITable; use super::IVerseBlock; use crate::error::CustomError; +use crate::intermediate::macros::iitem; use futures::future::{BoxFuture, FutureExt}; #[derive(Debug, Clone)] @@ -56,79 +56,117 @@ pub(crate) enum IElement { LatexEnvironment(ILatexEnvironment), } -iselector!(IElement, Element, |registry, elem| async { - match elem { - organic::types::Element::Paragraph(inner) => { - Ok(IElement::Paragraph(IParagraph::new(registry, inner).await?)) - } - organic::types::Element::PlainList(inner) => { - Ok(IElement::PlainList(IPlainList::new(registry, inner).await?)) - } - organic::types::Element::CenterBlock(inner) => Ok(IElement::CenterBlock( - ICenterBlock::new(registry, inner).await?, - )), - organic::types::Element::QuoteBlock(inner) => Ok(IElement::QuoteBlock( - IQuoteBlock::new(registry, inner).await?, - )), - organic::types::Element::SpecialBlock(inner) => Ok(IElement::SpecialBlock( - ISpecialBlock::new(registry, inner).await?, - )), - organic::types::Element::DynamicBlock(inner) => Ok(IElement::DynamicBlock( - IDynamicBlock::new(registry, inner).await?, - )), - organic::types::Element::FootnoteDefinition(inner) => Ok(IElement::FootnoteDefinition( - IFootnoteDefinition::new(registry, inner).await?, - )), - organic::types::Element::Comment(inner) => { - Ok(IElement::Comment(IComment::new(registry, inner).await?)) - } - organic::types::Element::Drawer(inner) => { - Ok(IElement::Drawer(IDrawer::new(registry, inner).await?)) - } - organic::types::Element::PropertyDrawer(inner) => Ok(IElement::PropertyDrawer( - IPropertyDrawer::new(registry, inner).await?, - )), - organic::types::Element::Table(inner) => { - Ok(IElement::Table(ITable::new(registry, inner).await?)) - } - organic::types::Element::VerseBlock(inner) => Ok(IElement::VerseBlock( - IVerseBlock::new(registry, inner).await?, - )), - organic::types::Element::CommentBlock(inner) => Ok(IElement::CommentBlock( - ICommentBlock::new(registry, inner).await?, - )), - organic::types::Element::ExampleBlock(inner) => Ok(IElement::ExampleBlock( - IExampleBlock::new(registry, inner).await?, - )), - organic::types::Element::ExportBlock(inner) => Ok(IElement::ExportBlock( - IExportBlock::new(registry, inner).await?, - )), - organic::types::Element::SrcBlock(inner) => { - Ok(IElement::SrcBlock(ISrcBlock::new(registry, inner).await?)) - } - organic::types::Element::Clock(inner) => { - Ok(IElement::Clock(IClock::new(registry, inner).await?)) - } - organic::types::Element::DiarySexp(inner) => { - Ok(IElement::DiarySexp(IDiarySexp::new(registry, inner).await?)) - } - organic::types::Element::Planning(inner) => { - Ok(IElement::Planning(IPlanning::new(registry, inner).await?)) - } - organic::types::Element::FixedWidthArea(inner) => Ok(IElement::FixedWidthArea( - IFixedWidthArea::new(registry, inner).await?, - )), - organic::types::Element::HorizontalRule(inner) => Ok(IElement::HorizontalRule( - IHorizontalRule::new(registry, inner).await?, - )), - organic::types::Element::Keyword(inner) => { - Ok(IElement::Keyword(IKeyword::new(registry, inner).await?)) - } - organic::types::Element::BabelCall(inner) => { - Ok(IElement::BabelCall(IBabelCall::new(registry, inner).await?)) - } - organic::types::Element::LatexEnvironment(inner) => Ok(IElement::LatexEnvironment( - ILatexEnvironment::new(registry, inner).await?, - )), - } +iselector!(IElement, Element, |registry, original| async { + iitem!( + registry, + original, + ( + organic::types::Element::Paragraph, + IElement::Paragraph, + IParagraph + ), + ( + organic::types::Element::PlainList, + IElement::PlainList, + IPlainList + ), + ( + organic::types::Element::CenterBlock, + IElement::CenterBlock, + ICenterBlock + ), + ( + organic::types::Element::QuoteBlock, + IElement::QuoteBlock, + IQuoteBlock + ), + ( + organic::types::Element::SpecialBlock, + IElement::SpecialBlock, + ISpecialBlock + ), + ( + organic::types::Element::DynamicBlock, + IElement::DynamicBlock, + IDynamicBlock + ), + ( + organic::types::Element::FootnoteDefinition, + IElement::FootnoteDefinition, + IFootnoteDefinition + ), + ( + organic::types::Element::Comment, + IElement::Comment, + IComment + ), + (organic::types::Element::Drawer, IElement::Drawer, IDrawer), + ( + organic::types::Element::PropertyDrawer, + IElement::PropertyDrawer, + IPropertyDrawer + ), + (organic::types::Element::Table, IElement::Table, ITable), + ( + organic::types::Element::VerseBlock, + IElement::VerseBlock, + IVerseBlock + ), + ( + organic::types::Element::CommentBlock, + IElement::CommentBlock, + ICommentBlock + ), + ( + organic::types::Element::ExampleBlock, + IElement::ExampleBlock, + IExampleBlock + ), + ( + organic::types::Element::ExportBlock, + IElement::ExportBlock, + IExportBlock + ), + ( + organic::types::Element::SrcBlock, + IElement::SrcBlock, + ISrcBlock + ), + (organic::types::Element::Clock, IElement::Clock, IClock), + ( + organic::types::Element::DiarySexp, + IElement::DiarySexp, + IDiarySexp + ), + ( + organic::types::Element::Planning, + IElement::Planning, + IPlanning + ), + ( + organic::types::Element::FixedWidthArea, + IElement::FixedWidthArea, + IFixedWidthArea + ), + ( + organic::types::Element::HorizontalRule, + IElement::HorizontalRule, + IHorizontalRule + ), + ( + organic::types::Element::Keyword, + IElement::Keyword, + IKeyword + ), + ( + organic::types::Element::BabelCall, + IElement::BabelCall, + IBabelCall + ), + ( + organic::types::Element::LatexEnvironment, + IElement::LatexEnvironment, + ILatexEnvironment + ), + ) }); diff --git a/src/intermediate/macros.rs b/src/intermediate/macros.rs index 2ccbacf..42f9de0 100644 --- a/src/intermediate/macros.rs +++ b/src/intermediate/macros.rs @@ -54,3 +54,17 @@ macro_rules! iselector { } pub(crate) use iselector; + +macro_rules! iitem { + ($registry:expr, $original:expr, $(($penum:path, $ienum:path, $istruct:ident),)*) => { + match $original { +$( + &$penum(inner) => Ok($ienum( + $istruct::new($registry, &inner).await?, + )), +)* + } + }; +} + +pub(crate) use iitem; diff --git a/src/intermediate/object.rs b/src/intermediate/object.rs index b041384..7b183c0 100644 --- a/src/intermediate/object.rs +++ b/src/intermediate/object.rs @@ -1,4 +1,5 @@ use crate::error::CustomError; +use crate::intermediate::macros::iitem; use super::angle_link::IAngleLink; use super::bold::IBold; @@ -62,88 +63,124 @@ pub(crate) enum IObject { Timestamp(ITimestamp), } -iselector!(IObject, Object, |registry, obj| async { - match &obj { - organic::types::Object::Bold(inner) => { - Ok(IObject::Bold(IBold::new(registry, inner).await?)) - } - organic::types::Object::Italic(inner) => { - Ok(IObject::Italic(IItalic::new(registry, inner).await?)) - } - organic::types::Object::Underline(inner) => { - Ok(IObject::Underline(IUnderline::new(registry, inner).await?)) - } - organic::types::Object::StrikeThrough(inner) => Ok(IObject::StrikeThrough( - IStrikeThrough::new(registry, inner).await?, - )), - organic::types::Object::Code(inner) => { - Ok(IObject::Code(ICode::new(registry, inner).await?)) - } - organic::types::Object::Verbatim(inner) => { - Ok(IObject::Verbatim(IVerbatim::new(registry, inner).await?)) - } - organic::types::Object::PlainText(inner) => { - Ok(IObject::PlainText(IPlainText::new(registry, inner).await?)) - } - organic::types::Object::RegularLink(inner) => Ok(IObject::RegularLink( - IRegularLink::new(registry, inner).await?, - )), - organic::types::Object::RadioLink(inner) => { - Ok(IObject::RadioLink(IRadioLink::new(registry, inner).await?)) - } - organic::types::Object::RadioTarget(inner) => Ok(IObject::RadioTarget( - IRadioTarget::new(registry, inner).await?, - )), - organic::types::Object::PlainLink(inner) => { - Ok(IObject::PlainLink(IPlainLink::new(registry, inner).await?)) - } - organic::types::Object::AngleLink(inner) => { - Ok(IObject::AngleLink(IAngleLink::new(registry, inner).await?)) - } - organic::types::Object::OrgMacro(inner) => { - Ok(IObject::OrgMacro(IOrgMacro::new(registry, inner).await?)) - } - organic::types::Object::Entity(inner) => { - Ok(IObject::Entity(IEntity::new(registry, inner).await?)) - } - organic::types::Object::LatexFragment(inner) => Ok(IObject::LatexFragment( - ILatexFragment::new(registry, inner).await?, - )), - organic::types::Object::ExportSnippet(inner) => Ok(IObject::ExportSnippet( - IExportSnippet::new(registry, inner).await?, - )), - organic::types::Object::FootnoteReference(inner) => Ok(IObject::FootnoteReference( - IFootnoteReference::new(registry, inner).await?, - )), - organic::types::Object::Citation(inner) => { - Ok(IObject::Citation(ICitation::new(registry, inner).await?)) - } - organic::types::Object::CitationReference(inner) => Ok(IObject::CitationReference( - ICitationReference::new(registry, inner).await?, - )), - organic::types::Object::InlineBabelCall(inner) => Ok(IObject::InlineBabelCall( - IInlineBabelCall::new(registry, inner).await?, - )), - organic::types::Object::InlineSourceBlock(inner) => Ok(IObject::InlineSourceBlock( - IInlineSourceBlock::new(registry, inner).await?, - )), - organic::types::Object::LineBreak(inner) => { - Ok(IObject::LineBreak(ILineBreak::new(registry, inner).await?)) - } - organic::types::Object::Target(inner) => { - Ok(IObject::Target(ITarget::new(registry, inner).await?)) - } - organic::types::Object::StatisticsCookie(inner) => Ok(IObject::StatisticsCookie( - IStatisticsCookie::new(registry, inner).await?, - )), - organic::types::Object::Subscript(inner) => { - Ok(IObject::Subscript(ISubscript::new(registry, inner).await?)) - } - organic::types::Object::Superscript(inner) => Ok(IObject::Superscript( - ISuperscript::new(registry, inner).await?, - )), - organic::types::Object::Timestamp(inner) => { - Ok(IObject::Timestamp(ITimestamp::new(registry, inner).await?)) - } - } +iselector!(IObject, Object, |registry, original| async { + iitem!( + registry, + original, + (organic::types::Object::Bold, IObject::Bold, IBold), + (organic::types::Object::Italic, IObject::Italic, IItalic), + ( + organic::types::Object::Underline, + IObject::Underline, + IUnderline + ), + ( + organic::types::Object::StrikeThrough, + IObject::StrikeThrough, + IStrikeThrough + ), + (organic::types::Object::Code, IObject::Code, ICode), + ( + organic::types::Object::Verbatim, + IObject::Verbatim, + IVerbatim + ), + ( + organic::types::Object::PlainText, + IObject::PlainText, + IPlainText + ), + ( + organic::types::Object::RegularLink, + IObject::RegularLink, + IRegularLink + ), + ( + organic::types::Object::RadioLink, + IObject::RadioLink, + IRadioLink + ), + ( + organic::types::Object::RadioTarget, + IObject::RadioTarget, + IRadioTarget + ), + ( + organic::types::Object::PlainLink, + IObject::PlainLink, + IPlainLink + ), + ( + organic::types::Object::AngleLink, + IObject::AngleLink, + IAngleLink + ), + ( + organic::types::Object::OrgMacro, + IObject::OrgMacro, + IOrgMacro + ), + (organic::types::Object::Entity, IObject::Entity, IEntity), + ( + organic::types::Object::LatexFragment, + IObject::LatexFragment, + ILatexFragment + ), + ( + organic::types::Object::ExportSnippet, + IObject::ExportSnippet, + IExportSnippet + ), + ( + organic::types::Object::FootnoteReference, + IObject::FootnoteReference, + IFootnoteReference + ), + ( + organic::types::Object::Citation, + IObject::Citation, + ICitation + ), + ( + organic::types::Object::CitationReference, + IObject::CitationReference, + ICitationReference + ), + ( + organic::types::Object::InlineBabelCall, + IObject::InlineBabelCall, + IInlineBabelCall + ), + ( + organic::types::Object::InlineSourceBlock, + IObject::InlineSourceBlock, + IInlineSourceBlock + ), + ( + organic::types::Object::LineBreak, + IObject::LineBreak, + ILineBreak + ), + (organic::types::Object::Target, IObject::Target, ITarget), + ( + organic::types::Object::StatisticsCookie, + IObject::StatisticsCookie, + IStatisticsCookie + ), + ( + organic::types::Object::Subscript, + IObject::Subscript, + ISubscript + ), + ( + organic::types::Object::Superscript, + IObject::Superscript, + ISuperscript + ), + ( + organic::types::Object::Timestamp, + IObject::Timestamp, + ITimestamp + ), + ) });