use std::borrow::Cow; use std::rc::Rc; use never::Never; use orchid_base::interner::Tok; use orchid_base::name::Sym; use orchid_extension::atom::Atomic; use orchid_extension::atom_owned::{OwnedAtom, OwnedVariant}; use orchid_extension::context::i; use crate::macros::mactree::MacTreeSeq; use crate::macros::rule::matcher::Matcher; #[derive(Debug)] pub struct MacroData { pub module: Sym, pub prio: Option, pub rules: Vec, } #[derive(Clone, Debug)] pub struct Macro(pub Rc); impl Macro { pub async fn canonical_name(&self) -> Sym { self.0.module.suffix([self.0.rules[0].body_name.clone()], &i()).await } } #[derive(Debug)] pub struct Rule { pub pattern: MacTreeSeq, pub matcher: Matcher, pub placeholders: Vec>, pub body_name: Tok, } impl Atomic for Macro { type Data = (); type Variant = OwnedVariant; } impl OwnedAtom for Macro { type Refs = Never; async fn val(&self) -> Cow<'_, Self::Data> { Cow::Owned(()) } }