mod elements;
mod expression;
mod list;
mod span;
mod table;
mod traversable;
pub use elements::*;
pub use expression::*;
pub use list::*;
pub use span::*;
pub use table::*;
pub use traversable::*;
use serde::Serialize;
#[derive(Debug, Clone, Serialize, PartialEq, Eq)]
pub enum MentionType {
Discussion,
User,
}
#[derive(Debug, Clone, Serialize, Default)]
pub struct ResolvedFile {
pub url: String,
pub is_valid: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub width: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub height: Option<u32>,
}
#[derive(Debug, Clone, Serialize, Default)]
pub struct ResolvedDoc {
pub title: String,
pub is_valid: bool,
}
#[derive(Debug, Clone, Serialize, Default)]
pub struct ResolvedMediaInfo {
#[serde(skip_serializing_if = "Option::is_none")]
pub file: Option<ResolvedFile>,
#[serde(skip_serializing_if = "Option::is_none")]
pub document: Option<ResolvedDoc>,
#[serde(skip_serializing_if = "Option::is_none")]
pub category: Option<ResolvedDoc>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user: Option<ResolvedDoc>,
#[serde(skip_serializing_if = "Option::is_none")]
pub url: Option<String>,
}
#[derive(Debug, Clone, Serialize)]
pub enum Element {
Text(TextElement),
Comment(CommentElement),
Escape(EscapeElement),
Error(ErrorElement),
Literal(LiteralElement),
Define(DefineElement),
Styled(StyledElement),
Table(TableElement),
List(ListElement),
Fold(FoldElement),
BlockQuote(BlockQuoteElement),
Ruby(RubyElement),
Footnote(FootnoteElement),
Code(CodeElement),
TeX(TeXElement),
Css(CssElement),
Include(IncludeElement),
Category(CategoryElement),
Redirect(RedirectElement),
Media(MediaElement),
ExternalMedia(ExternalMediaElement),
Null(NullElement),
FootnoteRef(FootnoteRefElement),
TimeNow(TimeNowElement),
Age(AgeElement),
Variable(VariableElement),
Mention(MentionElement),
Bold(TextStyleElement),
Italic(TextStyleElement),
Strikethrough(TextStyleElement),
Underline(TextStyleElement),
Superscript(TextStyleElement),
Subscript(TextStyleElement),
SoftBreak(SoftBreakElement),
HardBreak(HardBreakElement),
Clear(ClearElement),
HLine(HLineElement),
Header(HeaderElement),
If(IfElement),
}
impl Element {
pub fn span(&self) -> &Span {
match self {
Element::Text(e) => &e.span,
Element::Comment(e) => &e.span,
Element::Escape(e) => &e.span,
Element::Error(e) => &e.span,
Element::Literal(e) => &e.span,
Element::Define(e) => &e.span,
Element::Styled(e) => &e.span,
Element::Table(e) => &e.span,
Element::List(e) => &e.span,
Element::Fold(e) => &e.span,
Element::BlockQuote(e) => &e.span,
Element::Ruby(e) => &e.span,
Element::Footnote(e) => &e.span,
Element::Code(e) => &e.span,
Element::TeX(e) => &e.span,
Element::Css(e) => &e.span,
Element::Include(e) => &e.span,
Element::Category(e) => &e.span,
Element::Redirect(e) => &e.span,
Element::Media(e) => &e.span,
Element::ExternalMedia(e) => &e.span,
Element::Null(e) => &e.span,
Element::FootnoteRef(e) => &e.span,
Element::TimeNow(e) => &e.span,
Element::Age(e) => &e.span,
Element::Variable(e) => &e.span,
Element::Mention(e) => &e.span,
Element::Bold(e)
| Element::Italic(e)
| Element::Strikethrough(e)
| Element::Underline(e)
| Element::Superscript(e)
| Element::Subscript(e) => &e.span,
Element::SoftBreak(e) => &e.span,
Element::HardBreak(e) => &e.span,
Element::Clear(e) => &e.span,
Element::HLine(e) => &e.span,
Element::Header(e) => &e.span,
Element::If(e) => &e.span,
}
}
}