summaryrefslogtreecommitdiff
path: root/src/syntax/markup.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/syntax/markup.rs')
-rw-r--r--src/syntax/markup.rs29
1 files changed, 12 insertions, 17 deletions
diff --git a/src/syntax/markup.rs b/src/syntax/markup.rs
index de547f76..49b2a519 100644
--- a/src/syntax/markup.rs
+++ b/src/syntax/markup.rs
@@ -3,17 +3,14 @@ use crate::node;
use crate::util::EcoString;
use std::fmt::Write;
-/// The syntactical root capable of representing a full parsed document.
-pub type Markup = Vec<MarkupNode>;
-
-impl TypedNode for Markup {
- fn cast_from(node: RedRef) -> Option<Self> {
- if node.kind() != &NodeKind::Markup {
- return None;
- }
+node! {
+ /// The syntactical root capable of representing a full parsed document.
+ Markup
+}
- let children = node.children().filter_map(TypedNode::cast_from).collect();
- Some(children)
+impl Markup {
+ pub fn nodes<'a>(&'a self) -> impl Iterator<Item = MarkupNode> + 'a {
+ self.0.children().filter_map(RedRef::cast)
}
}
@@ -66,14 +63,12 @@ impl TypedNode for MarkupNode {
NodeKind::NonBreakingSpace => {
Some(MarkupNode::Text(EcoString::from("\u{00A0}")))
}
- NodeKind::Raw(_) => Some(MarkupNode::Raw(RawNode::cast_from(node).unwrap())),
- NodeKind::Heading => {
- Some(MarkupNode::Heading(HeadingNode::cast_from(node).unwrap()))
- }
- NodeKind::List => Some(MarkupNode::List(ListNode::cast_from(node).unwrap())),
- NodeKind::Enum => Some(MarkupNode::Enum(EnumNode::cast_from(node).unwrap())),
+ NodeKind::Raw(_) => node.cast().map(MarkupNode::Raw),
+ NodeKind::Heading => node.cast().map(MarkupNode::Heading),
+ NodeKind::List => node.cast().map(MarkupNode::List),
+ NodeKind::Enum => node.cast().map(MarkupNode::Enum),
NodeKind::Error(_, _) => None,
- _ => Some(MarkupNode::Expr(Expr::cast_from(node)?)),
+ _ => node.cast().map(MarkupNode::Expr),
}
}
}