use crate::*; macro_rules!dsl_sym( (|$state:ident:$State:ty| -> $type:ty {$($lit:literal => $exp:expr),* $(,)?})=>{ impl<'t> DslSymNs<'t, $type> for $State { const NS: DslNs<'t, fn (&'t $State)->$type> = DslNs(&[$(($lit, |$state: &$State|$exp)),*]); } }); pub trait DslSymNs<'t, T: 't>: 't { const NS: DslNs<'t, fn (&'t Self)->T>; } pub struct DslNs<'t, T: 't>(pub &'t [(&'t str, T)]); pub type DslCb = fn (&App) -> Box>; impl<'t, D: Dsl> std::ops::Index for DslNs<'t, DslCb> { type Output = DslCb; fn index (&self, index: D) -> &Self::Output { if let Ok(Some(symbol)) = index.src() { for (key, value) in self.0.iter() { if symbol == *key { return value } } } &(view_nil as DslCb) } } fn view_nil (_: &App) -> Box> { Box::new(Fill::xy("ยท")) }