Skip to main content

oak_notedown/parser/
element_type.rs

1use crate::lexer::token_type::NoteTokenType;
2use oak_core::{ElementType, UniversalElementRole};
3
4/// Element type for Notedown AST
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
6#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7#[repr(u8)]
8pub enum NoteElementType {
9    /// Root node of the document
10    Root,
11    /// Heading node
12    Heading,
13    /// List container
14    List,
15    /// Single list item
16    ListItem,
17    /// Table container
18    Table,
19    /// Single table row
20    TableRow,
21    /// Code block node
22    CodeBlock,
23    /// Paragraph of text
24    Paragraph,
25    /// Blockquote container
26    Blockquote,
27    /// Horizontal rule separator
28    HorizontalRule,
29    /// Link container
30    Link,
31    /// Image container
32    Image,
33    /// HTML content
34    Html,
35    /// Error node
36    Error,
37
38    /// Token-derived elements
39    Token(NoteTokenType),
40}
41
42impl ElementType for NoteElementType {
43    type Role = UniversalElementRole;
44
45    fn is_root(&self) -> bool {
46        matches!(self, Self::Root)
47    }
48
49    fn role(&self) -> Self::Role {
50        match self {
51            Self::Root => UniversalElementRole::Root,
52            Self::Heading | Self::Paragraph | Self::Blockquote | Self::HorizontalRule | Self::CodeBlock => UniversalElementRole::Statement,
53            Self::List | Self::Table | Self::Link | Self::Image | Self::Html => UniversalElementRole::Container,
54            Self::ListItem | Self::TableRow => UniversalElementRole::Container,
55            Self::Error => UniversalElementRole::Error,
56            Self::Token(_) => UniversalElementRole::None,
57        }
58    }
59}
60
61impl From<NoteTokenType> for NoteElementType {
62    fn from(token: NoteTokenType) -> Self {
63        Self::Token(token)
64    }
65}