Skip to main content

as_extension_data

Macro as_extension_data 

Source
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");