mirror of
https://github.com/TECHNOFAB11/aerosol.git
synced 2025-12-11 23:50:07 +01:00
Simplify implementation of join macro
This commit is contained in:
parent
cc46fbe621
commit
294572426b
1 changed files with 31 additions and 28 deletions
59
src/join.rs
59
src/join.rs
|
|
@ -1,5 +1,5 @@
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
#[macro_export(local_inner_macros)]
|
#[macro_export]
|
||||||
macro_rules! join {
|
macro_rules! join {
|
||||||
{
|
{
|
||||||
$caller:tt
|
$caller:tt
|
||||||
|
|
@ -13,41 +13,44 @@ macro_rules! join {
|
||||||
{
|
{
|
||||||
$caller:tt
|
$caller:tt
|
||||||
sep = [{ $($sep:tt)* }]
|
sep = [{ $($sep:tt)* }]
|
||||||
item = [{ $($head:tt)* }]
|
item = [{ $($first:tt)* }]
|
||||||
$(
|
|
||||||
item = [{ $($tail:tt)* }]
|
|
||||||
)+
|
|
||||||
} => {
|
} => {
|
||||||
$crate::tt_call::tt_call! {
|
$crate::tt_call::tt_return! {
|
||||||
macro = [{ $crate::join }]
|
$caller
|
||||||
sep = [{ $($sep)* }]
|
joined = [{ $($first)* }]
|
||||||
$(
|
|
||||||
item = [{ $($tail)* }]
|
|
||||||
)+
|
|
||||||
~~> $crate::join! {
|
|
||||||
$caller
|
|
||||||
prepend = [{ $($head)* $($sep)* }]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
{
|
{
|
||||||
$caller:tt
|
$caller:tt
|
||||||
sep = [{ $($sep:tt)* }]
|
sep = [{ $($sep:tt)* }]
|
||||||
item = [{ $($head:tt)* }]
|
item = [{ $($first:tt)* }]
|
||||||
|
item = [{ $($second:tt)* }]
|
||||||
|
$(
|
||||||
|
item = [{ $($rest:tt)* }]
|
||||||
|
)*
|
||||||
} => {
|
} => {
|
||||||
$crate::tt_call::tt_return! {
|
$crate::join! {
|
||||||
$caller
|
$caller
|
||||||
joined = [{ $($head)* }]
|
sep = [{ $($sep)* }]
|
||||||
}
|
item = [{ $($first)* $($sep)* $($second)* }]
|
||||||
};
|
$(
|
||||||
{
|
item = [{ $($rest)* }]
|
||||||
$caller:tt
|
)*
|
||||||
prepend = [{ $($prepend:tt)* }]
|
|
||||||
joined = [{ $($joined:tt)* }]
|
|
||||||
} => {
|
|
||||||
$crate::tt_call::tt_return! {
|
|
||||||
$caller
|
|
||||||
joined = [{ $($prepend)* $($joined)* }]
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_join() {
|
||||||
|
use tt_call::*;
|
||||||
|
|
||||||
|
let s = tt_call! {
|
||||||
|
macro = [{ join }]
|
||||||
|
sep = [{ .chars().rev().collect::<String>() + "_" + & }]
|
||||||
|
item = [{ "first " }]
|
||||||
|
item = [{ "second ".trim() }]
|
||||||
|
item = [{ "third " }]
|
||||||
|
};
|
||||||
|
|
||||||
|
assert_eq!(s, " tsrif_dnoces_third ");
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue