@@ -3,7 +3,7 @@ Credits(mainly, except Array & reverse conversions):
33https://github.com/poga/actix-lua/blob/master/src/message.rs
44*/
55
6- use std:: collections:: HashMap ;
6+ use std:: collections:: { HashMap , VecDeque } ;
77use std:: iter:: FromIterator ;
88
99use 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
8591impl 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
92110impl From < VariadicLuaMessage > for LuaMessage {
93111 fn from ( s : VariadicLuaMessage ) -> Self {
94- LuaMessage :: from ( s. 0 )
112+ LuaMessage :: from_slice ( s. 0 )
95113 }
96114}
97115impl 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
173197impl 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
395434impl < ' 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+
420469impl 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
428477impl 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) ]
445553mod tests {
446554 use super :: * ;
0 commit comments