macro_rules! as_extension_data {
($arena:expr, $ref:expr, $ext_type:ty) => { ... };
($node:expr, $ext_type:ty) => { ... };
}Expand description
Helper macro to downcast extension data.
ยงExamples
use core::fmt::{self, Write};
use rushdown::ast::{Arena, NodeRef, NodeType, NodeKind, KindData, PrettyPrint, pp_indent};
use rushdown::as_extension_data;
#[derive(Debug)]
struct Admonition {
kind: String,
}
impl NodeKind for Admonition {
fn typ(&self) -> NodeType { NodeType::ContainerBlock }
fn kind_name(&self) -> &'static str { "Admonition" }
}
impl PrettyPrint for Admonition {
fn pretty_print(&self, w: &mut dyn Write, _source: &str, level: usize) -> fmt::Result {
writeln!(w, "{}kind: {}", pp_indent(level), self.kind)
}
}
impl From<Admonition> for KindData {
fn from(e: Admonition) -> Self { KindData::Extension(Box::new(e)) }
}
let mut arena = Arena::new();
let ext_ref: NodeRef = arena.new_node(Admonition{kind: "note".to_string()});
let ext_data = as_extension_data!(arena, ext_ref, Admonition);
assert_eq!(ext_data.kind, "note");
let ext_data = as_extension_data!(arena[ext_ref], Admonition);
assert_eq!(ext_data.kind, "note");