From 1ad2d43d5a98e038071dd1300c2ce104ab7e8fec Mon Sep 17 00:00:00 2001 From: unspeaker Date: Tue, 15 Apr 2025 18:00:44 +0300 Subject: [PATCH] 0.8.0: add expose! and impose! macros --- Cargo.lock | 14 +++++++------- Cargo.toml | 2 +- dsl/src/lib.rs | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b0ef5c0..2a2cf65 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -413,9 +413,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.171" +version = "0.2.172" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" [[package]] name = "linux-raw-sys" @@ -934,7 +934,7 @@ dependencies = [ [[package]] name = "tengri" -version = "0.7.1" +version = "0.8.0" dependencies = [ "tengri_dsl", "tengri_input", @@ -944,7 +944,7 @@ dependencies = [ [[package]] name = "tengri_dsl" -version = "0.7.1" +version = "0.8.0" dependencies = [ "itertools 0.14.0", "konst", @@ -955,7 +955,7 @@ dependencies = [ [[package]] name = "tengri_input" -version = "0.7.1" +version = "0.8.0" dependencies = [ "tengri_dsl", "tengri_tui", @@ -963,7 +963,7 @@ dependencies = [ [[package]] name = "tengri_output" -version = "0.7.1" +version = "0.8.0" dependencies = [ "proptest", "proptest-derive", @@ -974,7 +974,7 @@ dependencies = [ [[package]] name = "tengri_tui" -version = "0.7.1" +version = "0.8.0" dependencies = [ "atomic_float", "better-panic", diff --git a/Cargo.toml b/Cargo.toml index b9a6dab..ae648af 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace.package] -version = "0.7.1" +version = "0.8.0" [workspace] resolver = "2" diff --git a/dsl/src/lib.rs b/dsl/src/lib.rs index eae465f..27b542c 100644 --- a/dsl/src/lib.rs +++ b/dsl/src/lib.rs @@ -10,6 +10,7 @@ pub(crate) use self::ParseError::*; pub(crate) use konst::iter::{ConstIntoIter, IsIteratorKind}; pub(crate) use konst::string::{split_at, str_range, char_indices}; pub(crate) use std::fmt::Debug; + /// Static iteration helper. #[macro_export] macro_rules! iterate { ($expr:expr => $arg: pat => $body:expr) => { @@ -20,6 +21,7 @@ pub(crate) use std::fmt::Debug; } } } + /// Implement the const iterator pattern. #[macro_export] macro_rules! const_iter { ($(<$l:lifetime>)?|$self:ident: $Struct:ty| => $Item:ty => $expr:expr) => { @@ -34,6 +36,37 @@ pub(crate) use std::fmt::Debug; } } } + +#[macro_export] macro_rules! expose { + ($([$self:ident:$State:ty] { $($Type:ty => { $($pat:pat => $expr:expr),* $(,)? })* })*) => { + $(expose!(@impl [$self: $State] { $($Type => { $($pat => $expr),* })* });)* + }; + (@impl [$self:ident:$State:ty] { $($Type:ty => { $($pat:pat => $expr:expr),* $(,)? })* }) => { + $(expose!(@type $Type [$self: $State] => { $($pat => $expr),* });)* + }; + (@type bool [$self:ident: $State:ty] => { $($pat:pat => $expr:expr),* $(,)? }) => { + provide_bool!(bool: |$self: $State| { $($pat => $expr),* }); + }; + (@type isize [$self:ident: $State:ty] => { $($pat:pat => $expr:expr),* $(,)? }) => { + provide_num!(u16: |$self: $State| { $($pat => $expr),* }); + }; + (@type usize [$self:ident: $State:ty] => { $($pat:pat => $expr:expr),* $(,)? }) => { + provide_num!(usize: |$self: $State| { $($pat => $expr),* }); + }; + (@type isize [$self:ident: $State:ty] => { $($pat:pat => $expr:expr),* $(,)? }) => { + provide_num!(isize: |$self: $State| { $($pat => $expr),* }); + }; + (@type $Type:ty [$self:ident: $State:ty] => { $($pat:pat => $expr:expr),* $(,)? }) => { + provide!($Type: |$self: $State| { $($pat => $expr),* }); + }; +} + +#[macro_export] macro_rules! impose { + ([$self:ident:$Struct:ty] { $($Command:ty => $variants:tt)* }) => { + $(atom_command!($Command: |$self: $Struct| $variants);)* + }; +} + //#[cfg(test)] #[test] fn test_examples () -> Result<(), ParseError> { //// Let's pretend to render some view. //let source = include_str!("../../tek/src/view_arranger.edn");