diff --git a/dsl/src/dsl_conv.rs b/dsl/src/dsl_conv.rs index 033e6eb..3d125a4 100644 --- a/dsl/src/dsl_conv.rs +++ b/dsl/src/dsl_conv.rs @@ -6,15 +6,15 @@ pub struct DslNs<'t, T: 't>(pub &'t [(&'t str, T)]); /// Namespace where keys are symbols. pub trait DslSymNs<'t, T: 't>: 't { const SYMS: DslNs<'t, fn (&'t Self)->T>; - fn from_sym (&'t self, dsl: D) -> Usually { + fn from_sym (&'t self, dsl: D) -> Perhaps { if let Some(dsl) = dsl.sym()? { for (sym, get) in Self::SYMS.0 { if dsl == *sym { - return Ok(get(self)) + return Ok(Some(get(self))) } } } - return Err(format!("not found: sym: {dsl:?}").into()) + return Ok(None) } } @@ -26,11 +26,21 @@ pub trait DslSymNs<'t, T: 't>: 't { pub trait DslExpNs<'t, T: 't>: 't { const EXPS: DslNs<'t, fn (&'t Self, &str)->T>; + fn from_exp (&'t self, dsl: D) -> Perhaps { + if let Some(exp) = dsl.exp()? { + for (key, value) in Self::EXPS.0.iter() { + if exp.head() == Ok(Some(key)) { + return Ok(Some(value(self, exp.tail()?.unwrap_or("")))) + } + } + } + return Ok(None) + } } #[macro_export] macro_rules! dsl_exp ( - (|$state:ident:$State:ty|->$type:ty { $( - [$key:literal $(/ $sub:ident: $Sub:ty)? $(, $arg:ident $(?)? :$argtype:ty)*] => $body:expr + (|$state:ident:$State:ty$(, $tail:ident)?|->$type:ty { $( + ($key:literal $(/ $sub:ident: $Sub:ty)? $(, $arg:ident $(?)? :$argtype:ty)*) => $body:expr ),* $(,)? }) => { impl<'t> DslExpNs<'t, $type> for $State { const EXPS: DslNs<'t, fn (&'t $State, &str)->$type> =