Skip to content

Commit ed4e847

Browse files
committed
Implement tuple for Variadic Parameters.
1 parent 26acebf commit ed4e847

2 files changed

Lines changed: 140 additions & 31 deletions

File tree

src/actor.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,7 @@ impl Actor {
346346
#[test]
347347
fn test_actor_new() {
348348
use rlua::Variadic;
349-
use std::iter::FromIterator;
349+
// use std::iter::FromIterator;
350350

351351
fn test_actor(act: Actor) {
352352
let _ = act.exec_nowait(
@@ -420,7 +420,8 @@ fn test_actor_new() {
420420
"testvargs",
421421
// Variadic::<LuaMessage>::from_iter([6.into(), 7.into()]),
422422
// Vec::<LuaMessage>::from([6.into(), 7.into()]),
423-
MultiLuaMessage::from_slice([6, 7]),
423+
// MultiLuaMessage::from_slice([6, 7]),
424+
(6, 7.0, ""),
424425
) {
425426
Ok(_v) => {
426427
assert_eq!(Some(13), Option::from(_v));

src/message.rs

Lines changed: 137 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ Credits(mainly, except Array & reverse conversions):
33
https://github.com/poga/actix-lua/blob/master/src/message.rs
44
*/
55

6-
use std::collections::HashMap;
6+
use std::collections::{HashMap, VecDeque};
77
use std::iter::FromIterator;
88

99
use rlua::Result as LuaResult;
@@ -80,18 +80,36 @@ impl From<LuaMessage> for Option<String> {
8080
}
8181

8282
#[derive(Debug, Clone)]
83-
pub struct VariadicLuaMessage(Variadic<LuaMessage>);
83+
pub struct VariadicLuaMessage(VecDeque<LuaMessage>);
84+
85+
impl VariadicLuaMessage {
86+
pub fn push_front(&mut self, value: LuaMessage) {
87+
self.0.push_front(value);
88+
}
89+
}
8490

8591
impl PartialEq<VariadicLuaMessage> for VariadicLuaMessage {
8692
fn eq(&self, other: &VariadicLuaMessage) -> bool {
87-
let other = other.0.to_vec();
88-
return self.0.to_vec().eq(&other);
93+
let other = &other.0;
94+
return self.0.eq(other);
95+
}
96+
}
97+
98+
impl From<VecDeque<LuaMessage>> for LuaMessage {
99+
fn from(s: VecDeque<LuaMessage>) -> Self {
100+
LuaMessage::from_iter(s.into_iter())
101+
}
102+
}
103+
104+
impl Into<VecDeque<LuaMessage>> for VariadicLuaMessage {
105+
fn into(self) -> VecDeque<LuaMessage> {
106+
return self.0;
89107
}
90108
}
91109

92110
impl From<VariadicLuaMessage> for LuaMessage {
93111
fn from(s: VariadicLuaMessage) -> Self {
94-
LuaMessage::from(s.0)
112+
LuaMessage::from_slice(s.0)
95113
}
96114
}
97115
impl From<Variadic<LuaMessage>> for LuaMessage {
@@ -139,36 +157,42 @@ macro_rules! lua_message_convert_from_collection_option {
139157
}
140158
};
141159
}
142-
macro_rules! lua_message_convert_from_collection_and_types {
160+
macro_rules! lua_message_convert_from_collection_variants_only {
143161
($y:ty) => {
144162
lua_message_convert_from_collection!(Vec, $y);
145163
lua_message_convert_from_collection!(Variadic, $y);
146164
lua_message_convert_from_collection_option!(Vec, $y);
147165
lua_message_convert_from_collection_option!(Variadic, $y);
166+
};
167+
}
168+
macro_rules! lua_message_convert_from_collection_variants_and_types {
169+
($y:ty) => {
170+
lua_message_convert_from_collection_variants_only!($y);
148171
impl From<$y> for MultiLuaMessage {
149172
fn from(s: $y) -> Self {
150173
LuaMessage::from(s).into()
151174
}
152175
}
153176
};
154177
}
155-
lua_message_convert_from_collection_and_types!(String);
156-
lua_message_convert_from_collection_and_types!(bool);
157-
lua_message_convert_from_collection_and_types!(i8);
158-
lua_message_convert_from_collection_and_types!(u8);
159-
lua_message_convert_from_collection_and_types!(i16);
160-
lua_message_convert_from_collection_and_types!(u16);
161-
lua_message_convert_from_collection_and_types!(i32);
162-
lua_message_convert_from_collection_and_types!(u32);
163-
lua_message_convert_from_collection_and_types!(i64);
164-
lua_message_convert_from_collection_and_types!(isize);
165-
lua_message_convert_from_collection_and_types!(usize);
166-
lua_message_convert_from_collection_and_types!(f32);
167-
lua_message_convert_from_collection_and_types!(f64);
168-
lua_message_convert_from_collection_and_types!(HashMap<String, LuaMessage>);
169-
// lua_message_convert_from_collection_and_types!(Vec<LuaMessage>);
170-
// lua_message_convert_from_collection_and_types!(VariadicLuaMessage);
171-
// lua_message_convert_from_collection_and_types!(Variadic<LuaMessage>);
178+
lua_message_convert_from_collection_variants_and_types!(String);
179+
lua_message_convert_from_collection_variants_and_types!(&str);
180+
lua_message_convert_from_collection_variants_and_types!(bool);
181+
lua_message_convert_from_collection_variants_and_types!(i8);
182+
lua_message_convert_from_collection_variants_and_types!(u8);
183+
lua_message_convert_from_collection_variants_and_types!(i16);
184+
lua_message_convert_from_collection_variants_and_types!(u16);
185+
lua_message_convert_from_collection_variants_and_types!(i32);
186+
lua_message_convert_from_collection_variants_and_types!(u32);
187+
lua_message_convert_from_collection_variants_and_types!(i64);
188+
lua_message_convert_from_collection_variants_and_types!(isize);
189+
lua_message_convert_from_collection_variants_and_types!(usize);
190+
lua_message_convert_from_collection_variants_and_types!(f32);
191+
lua_message_convert_from_collection_variants_and_types!(f64);
192+
lua_message_convert_from_collection_variants_and_types!(HashMap<String, LuaMessage>);
193+
lua_message_convert_from_collection_variants_only!(Vec<LuaMessage>);
194+
lua_message_convert_from_collection_variants_only!(VariadicLuaMessage);
195+
lua_message_convert_from_collection_variants_only!(Variadic<LuaMessage>);
172196

173197
impl Into<Variadic<LuaMessage>> for LuaMessage {
174198
fn into(self) -> Variadic<LuaMessage> {
@@ -318,7 +342,7 @@ impl From<LuaMessage> for Option<Vec<LuaMessage>> {
318342
Some(new_one)
319343
}
320344
LuaMessage::Array(_h) => Some(_h),
321-
LuaMessage::Variadic(_h) => Some(_h.0.to_vec()),
345+
LuaMessage::Variadic(_h) => Some(_h.0.into()),
322346
}
323347
}
324348
}
@@ -386,16 +410,33 @@ impl MultiLuaMessage {
386410
LuaMessage::Variadic(VariadicLuaMessage(
387411
iter.into_iter()
388412
.map(|v| v.into())
389-
.collect::<Variadic<LuaMessage>>(),
413+
.collect::<VecDeque<LuaMessage>>(),
390414
))
391415
.into()
392416
}
417+
418+
pub fn push_front(&mut self, value: LuaMessage) {
419+
match &mut self.0 {
420+
LuaMessage::Variadic(v) => {
421+
v.0.push_front(value);
422+
}
423+
_ => {
424+
let mut v = VecDeque::<LuaMessage>::new();
425+
v.push_front(self.0.clone());
426+
v.push_front(value);
427+
428+
self.0 = LuaMessage::Variadic(VariadicLuaMessage(v))
429+
}
430+
}
431+
}
393432
}
394433

395434
impl<'lua> ToLuaMulti<'lua> for MultiLuaMessage {
396435
fn to_lua_multi(self, lua: Context<'lua>) -> LuaResult<MultiValue<'lua>> {
397436
match self.0 {
398-
LuaMessage::Variadic(x) => Ok(x.0.to_lua_multi(lua)?),
437+
LuaMessage::Variadic(x) => {
438+
Ok(Variadic::<LuaMessage>::from_iter(x.0.into_iter()).to_lua_multi(lua)?)
439+
}
399440
_ => Ok(self.0.to_lua_multi(lua)?),
400441
}
401442
}
@@ -411,24 +452,32 @@ impl From<Vec<LuaMessage>> for MultiLuaMessage {
411452
fn from(s: Vec<LuaMessage>) -> Self {
412453
MultiLuaMessage {
413454
0: LuaMessage::Variadic(VariadicLuaMessage {
414-
0: Variadic::<LuaMessage>::from_iter(s),
455+
0: VecDeque::<LuaMessage>::from(s),
415456
}),
416457
}
417458
}
418459
}
419460

461+
impl From<VecDeque<LuaMessage>> for MultiLuaMessage {
462+
fn from(s: VecDeque<LuaMessage>) -> Self {
463+
MultiLuaMessage {
464+
0: LuaMessage::Variadic(VariadicLuaMessage { 0: s }),
465+
}
466+
}
467+
}
468+
420469
impl FromIterator<LuaMessage> for MultiLuaMessage {
421470
fn from_iter<I: IntoIterator<Item = LuaMessage>>(iter: I) -> Self {
422471
MultiLuaMessage {
423-
0: LuaMessage::Variadic(VariadicLuaMessage(Variadic::<LuaMessage>::from_iter(iter))),
472+
0: LuaMessage::Variadic(VariadicLuaMessage(VecDeque::<LuaMessage>::from_iter(iter))),
424473
}
425474
}
426475
}
427476

428477
impl From<Variadic<LuaMessage>> for MultiLuaMessage {
429478
fn from(s: Variadic<LuaMessage>) -> Self {
430479
MultiLuaMessage {
431-
0: LuaMessage::Variadic(VariadicLuaMessage(s)),
480+
0: LuaMessage::Variadic(VariadicLuaMessage(VecDeque::<LuaMessage>::from(s.to_vec()))),
432481
}
433482
}
434483
}
@@ -441,6 +490,65 @@ impl From<VariadicLuaMessage> for MultiLuaMessage {
441490
}
442491
}
443492

493+
macro_rules! impl_tuple {
494+
() => (
495+
impl Into<MultiLuaMessage> for () {
496+
fn into(self) -> MultiLuaMessage {
497+
MultiLuaMessage::from_iter([])
498+
}
499+
}
500+
);
501+
502+
($last:ident $($name:ident)*) => (
503+
impl<$($name,)* $last> Into<MultiLuaMessage> for ($($name,)* $last,)
504+
where $($name: Into<LuaMessage>,)*
505+
$last: Into<MultiLuaMessage>
506+
{
507+
#[allow(unused_mut)]
508+
#[allow(unused_variables)]
509+
#[allow(non_snake_case)]
510+
fn into(self) -> MultiLuaMessage {
511+
let ($($name,)* $last,) = self;
512+
513+
let mut results = $last.into();
514+
push_reverse!(results, $($name.into(),)*);
515+
results
516+
}
517+
}
518+
);
519+
}
520+
521+
macro_rules! push_reverse {
522+
($multi_value:expr, $first:expr, $($rest:expr,)*) => (
523+
push_reverse!($multi_value, $($rest,)*);
524+
$multi_value.push_front($first);
525+
);
526+
527+
($multi_value:expr, $first:expr) => (
528+
$multi_value.push_front($first);
529+
);
530+
531+
($multi_value:expr,) => ();
532+
}
533+
534+
impl_tuple!();
535+
impl_tuple!(A);
536+
impl_tuple!(A B);
537+
impl_tuple!(A B C);
538+
impl_tuple!(A B C D);
539+
impl_tuple!(A B C D E);
540+
impl_tuple!(A B C D E F);
541+
impl_tuple!(A B C D E F G);
542+
impl_tuple!(A B C D E F G H);
543+
impl_tuple!(A B C D E F G H I);
544+
impl_tuple!(A B C D E F G H I J);
545+
impl_tuple!(A B C D E F G H I J K);
546+
impl_tuple!(A B C D E F G H I J K L);
547+
impl_tuple!(A B C D E F G H I J K L M);
548+
impl_tuple!(A B C D E F G H I J K L M N);
549+
impl_tuple!(A B C D E F G H I J K L M N O);
550+
impl_tuple!(A B C D E F G H I J K L M N O P);
551+
444552
#[cfg(test)]
445553
mod tests {
446554
use super::*;

0 commit comments

Comments
 (0)