use super::Document; use super::Element; use super::Heading; use super::Object; use super::PlainListItem; use super::Section; use crate::parser::DocumentElement; pub enum Token<'r, 's> { Document(&'r Document<'s>), Heading(&'r Heading<'s>), Section(&'r Section<'s>), Object(&'r Object<'s>), Element(&'r Element<'s>), PlainListItem(&'r PlainListItem<'s>), } impl<'r, 's> Token<'r, 's> { pub fn iter_tokens(&self) -> Box> + '_> { match self { Token::Document(document) => Box::new( document .zeroth_section .iter() .map(Token::Section) .chain(document.children.iter().map(Token::Heading)), ), Token::Heading(heading) => Box::new(heading.title.iter().map(Token::Object).chain( heading.children.iter().map(|de| match de { DocumentElement::Heading(ref obj) => Token::Heading(obj), DocumentElement::Section(ref obj) => Token::Section(obj), }), )), Token::Section(section) => Box::new(section.children.iter().map(Token::Element)), Token::Object(obj) => match obj { Object::Bold(_) => todo!(), Object::Italic(_) => todo!(), Object::Underline(_) => todo!(), Object::StrikeThrough(_) => todo!(), Object::Code(_) => todo!(), Object::Verbatim(_) => todo!(), Object::PlainText(_) => todo!(), Object::RegularLink(_) => todo!(), Object::RadioLink(_) => todo!(), Object::RadioTarget(_) => todo!(), Object::PlainLink(_) => todo!(), Object::AngleLink(_) => todo!(), Object::OrgMacro(_) => todo!(), }, Token::Element(elem) => match elem { Element::Paragraph(inner) => Box::new(inner.children.iter().map(Token::Object)), Element::PlainList(inner) => { Box::new(inner.children.iter().map(Token::PlainListItem)) } Element::GreaterBlock(inner) => Box::new(inner.children.iter().map(Token::Element)), Element::DynamicBlock(_) => todo!(), Element::FootnoteDefinition(_) => todo!(), Element::Comment(_) => todo!(), Element::Drawer(_) => todo!(), Element::PropertyDrawer(_) => todo!(), Element::Table(_) => todo!(), Element::VerseBlock(_) => todo!(), Element::CommentBlock(_) => todo!(), Element::ExampleBlock(_) => todo!(), Element::ExportBlock(_) => todo!(), Element::SrcBlock(_) => todo!(), Element::Clock(_) => todo!(), Element::DiarySexp(_) => todo!(), Element::Planning(_) => todo!(), Element::FixedWidthArea(_) => todo!(), Element::HorizontalRule(_) => todo!(), Element::Keyword(_) => todo!(), Element::LatexEnvironment(_) => todo!(), }, Token::PlainListItem(elem) => Box::new(elem.children.iter().map(Token::Element)), } } }