mirror of
https://codeberg.org/unspeaker/tengri.git
synced 2025-12-06 11:46:42 +01:00
proc: auto implement Context on command target
Context and TryFromDsl overlap
This commit is contained in:
parent
3bb38f2d27
commit
20ccff13de
5 changed files with 17 additions and 13 deletions
|
|
@ -18,24 +18,20 @@ pub type ParseResult<T> = Result<T, ParseError>;
|
|||
|
||||
pub trait TryFromDsl<'state, T>: Sized {
|
||||
fn try_from_expr <'source: 'state> (
|
||||
_state: &'state T, _iter: TokenIter<'source>
|
||||
_state: &'state T, _iter: &mut TokenIter<'source>
|
||||
) -> Option<Self> {
|
||||
None
|
||||
}
|
||||
fn try_from_atom <'source: 'state> (
|
||||
state: &'state T, value: Value<'source>
|
||||
) -> Option<Self> {
|
||||
if let Exp(0, iter) = value {
|
||||
return Self::try_from_expr(state, iter.clone())
|
||||
if let Exp(0, mut iter) = value {
|
||||
return Self::try_from_expr(state, &mut iter)
|
||||
}
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
pub trait TryIntoDsl<T>: Sized {
|
||||
fn try_into_atom (&self) -> Option<Value>;
|
||||
}
|
||||
|
||||
/// Map EDN tokens to parameters of a given type for a given context
|
||||
pub trait Context<'state, U>: Sized {
|
||||
fn get <'source> (&'state self, _iter: &mut TokenIter<'source>) -> Option<U> {
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ impl<'state, S, C: DslCommand<'state, S>, I: DslInput> KeyMap<'state, S, C, I> f
|
|||
match exp_iter.next() {
|
||||
Some(Token { value: Value::Sym(binding), .. }) => {
|
||||
if input.matches_dsl(binding) {
|
||||
if let Some(command) = C::try_from_expr(state, exp_iter.clone()) {
|
||||
if let Some(command) = C::try_from_expr(state, &mut exp_iter) {
|
||||
return Some(command)
|
||||
}
|
||||
}
|
||||
|
|
@ -55,7 +55,7 @@ impl<'state, S, C: DslCommand<'state, S>, I: DslInput> KeyMap<'state, S, C, I> f
|
|||
match exp_iter.next() {
|
||||
Some(Token { value: Value::Sym(binding), .. }) => {
|
||||
if input.matches_dsl(binding) {
|
||||
if let Some(command) = C::try_from_expr(state, exp_iter.clone()) {
|
||||
if let Some(command) = C::try_from_expr(state, &mut exp_iter) {
|
||||
return Some(command)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ macro_rules! transform_xy {
|
|||
#[cfg(feature = "dsl")]
|
||||
impl<'state, E: Output + 'state, T: ViewContext<'state, E>> TryFromDsl<'state, T>
|
||||
for $Enum<RenderBox<'state, E>> {
|
||||
fn try_from_expr <'source: 'state> (state: &'state T, iter: TokenIter<'source>)
|
||||
fn try_from_expr <'source: 'state> (state: &'state T, iter: &mut TokenIter<'source>)
|
||||
-> Option<Self>
|
||||
{
|
||||
let mut iter = iter.clone();
|
||||
|
|
@ -88,7 +88,7 @@ macro_rules! transform_xy_unit {
|
|||
#[cfg(feature = "dsl")]
|
||||
impl<'state, E: Output + 'state, T: ViewContext<'state, E>> TryFromDsl<'state, T>
|
||||
for $Enum<E::Unit, RenderBox<'state, E>> {
|
||||
fn try_from_expr <'source: 'state> (state: &'state T, iter: TokenIter<'source>) -> Option<Self> {
|
||||
fn try_from_expr <'source: 'state> (state: &'state T, iter: &mut TokenIter<'source>) -> Option<Self> {
|
||||
let mut iter = iter.clone();
|
||||
if let Some(Token { value: Value::Key(k), .. }) = iter.peek() {
|
||||
if k == $x || k == $y {
|
||||
|
|
|
|||
|
|
@ -103,7 +103,7 @@ pub trait ViewContext<'state, E: Output + 'state>: Send + Sync
|
|||
> TryFromDsl<$lt_state, T> for $Struct {
|
||||
fn try_from_expr <$lt_source: $lt_state> (
|
||||
$state: &$lt_state T,
|
||||
$iter: TokenIter<$lt_source>
|
||||
$iter: &mut TokenIter<$lt_source>
|
||||
) -> Option<Self> {
|
||||
let mut $iter = $iter.clone();
|
||||
$body;
|
||||
|
|
|
|||
|
|
@ -70,7 +70,7 @@ impl ToTokens for CommandDef {
|
|||
/// Generated by [tengri_proc].
|
||||
impl<'state> TryFromDsl<'state, #target> for #enumeration {
|
||||
fn try_from_expr <'source: 'state> (
|
||||
state: &'state #target, iter: TokenIter<'source>
|
||||
state: &'state #target, iter: &mut ::tengri::dsl::TokenIter<'source>
|
||||
) -> Option<Self> {
|
||||
let mut iter = iter.clone();
|
||||
match iter.next() {
|
||||
|
|
@ -80,6 +80,14 @@ impl ToTokens for CommandDef {
|
|||
}
|
||||
}
|
||||
/// Generated by [tengri_proc].
|
||||
impl<'state> ::tengri::dsl::Context<'state, #enumeration> for #target {
|
||||
fn get <'source> (&self, iter: &mut ::tengri::dsl::TokenIter<'source>)
|
||||
-> Option<#enumeration>
|
||||
{
|
||||
#enumeration::try_from_expr(self, iter)
|
||||
}
|
||||
}
|
||||
/// Generated by [tengri_proc].
|
||||
impl Command<#target> for #enumeration {
|
||||
fn execute (self, state: &mut #target) -> Perhaps<Self> {
|
||||
match self {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue