From 20ccff13de1957c1268c6fec64048d8ae1767fd5 Mon Sep 17 00:00:00 2001 From: unspeaker Date: Fri, 9 May 2025 21:13:46 +0300 Subject: [PATCH] proc: auto implement Context on command target Context and TryFromDsl overlap --- dsl/src/dsl.rs | 10 +++------- input/src/input_dsl.rs | 4 ++-- output/src/ops/transform.rs | 4 ++-- output/src/view.rs | 2 +- proc/src/proc_command.rs | 10 +++++++++- 5 files changed, 17 insertions(+), 13 deletions(-) diff --git a/dsl/src/dsl.rs b/dsl/src/dsl.rs index b3d9448..f4eedaf 100644 --- a/dsl/src/dsl.rs +++ b/dsl/src/dsl.rs @@ -18,24 +18,20 @@ pub type ParseResult = Result; 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 { None } fn try_from_atom <'source: 'state> ( state: &'state T, value: Value<'source> ) -> Option { - 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: Sized { - fn try_into_atom (&self) -> Option; -} - /// 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 { diff --git a/input/src/input_dsl.rs b/input/src/input_dsl.rs index 0095579..cde5a15 100644 --- a/input/src/input_dsl.rs +++ b/input/src/input_dsl.rs @@ -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) } } diff --git a/output/src/ops/transform.rs b/output/src/ops/transform.rs index 611d22b..904eba4 100644 --- a/output/src/ops/transform.rs +++ b/output/src/ops/transform.rs @@ -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> { - 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 { 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> { - fn try_from_expr <'source: 'state> (state: &'state T, iter: TokenIter<'source>) -> Option { + fn try_from_expr <'source: 'state> (state: &'state T, iter: &mut TokenIter<'source>) -> Option { let mut iter = iter.clone(); if let Some(Token { value: Value::Key(k), .. }) = iter.peek() { if k == $x || k == $y { diff --git a/output/src/view.rs b/output/src/view.rs index 4bf3d73..f2e9ef4 100644 --- a/output/src/view.rs +++ b/output/src/view.rs @@ -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 { let mut $iter = $iter.clone(); $body; diff --git a/proc/src/proc_command.rs b/proc/src/proc_command.rs index 8d9d345..9504f91 100644 --- a/proc/src/proc_command.rs +++ b/proc/src/proc_command.rs @@ -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 { 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 { match self {