@@ -721,7 +721,6 @@ impl<'lua> Table<'lua> {
721
721
TableSequence {
722
722
table : self . 0 ,
723
723
index : 1 ,
724
- len : None ,
725
724
_phantom : PhantomData ,
726
725
}
727
726
}
@@ -733,17 +732,25 @@ impl<'lua> Table<'lua> {
733
732
}
734
733
735
734
#[ cfg( feature = "serialize" ) ]
736
- pub ( crate ) fn sequence_values_by_len < V : FromLua < ' lua > > (
737
- self ,
738
- len : Option < usize > ,
739
- ) -> TableSequence < ' lua , V > {
740
- let len = len. unwrap_or_else ( || self . raw_len ( ) ) as Integer ;
741
- TableSequence {
742
- table : self . 0 ,
743
- index : 1 ,
744
- len : Some ( len) ,
745
- _phantom : PhantomData ,
735
+ pub ( crate ) fn for_each_value < V > ( & self , mut f : impl FnMut ( V ) -> Result < ( ) > ) -> Result < ( ) >
736
+ where
737
+ V : FromLua < ' lua > ,
738
+ {
739
+ let lua = self . 0 . lua ;
740
+ let state = lua. state ( ) ;
741
+ unsafe {
742
+ let _sg = StackGuard :: new ( state) ;
743
+ check_stack ( state, 4 ) ?;
744
+
745
+ lua. push_ref ( & self . 0 ) ;
746
+ let len = ffi:: lua_rawlen ( state, -1 ) ;
747
+ for i in 1 ..=len {
748
+ ffi:: lua_rawgeti ( state, -1 , i as _ ) ;
749
+ f ( V :: from_stack ( -1 , lua) ?) ?;
750
+ ffi:: lua_pop ( state, 1 ) ;
751
+ }
746
752
}
753
+ Ok ( ( ) )
747
754
}
748
755
749
756
/// Sets element value at position `idx` without invoking metamethods.
@@ -1085,6 +1092,13 @@ impl<'a, 'lua> Serialize for SerializableTable<'a, 'lua> {
1085
1092
use crate :: serde:: de:: { check_value_for_skip, MapPairs } ;
1086
1093
use crate :: value:: SerializableValue ;
1087
1094
1095
+ let convert_result = |res : Result < ( ) > , serialize_err : Option < S :: Error > | match res {
1096
+ Ok ( v) => Ok ( v) ,
1097
+ Err ( Error :: SerializeError ( _) ) if serialize_err. is_some ( ) => Err ( serialize_err. unwrap ( ) ) ,
1098
+ Err ( Error :: SerializeError ( msg) ) => Err ( serde:: ser:: Error :: custom ( msg) ) ,
1099
+ Err ( err) => Err ( serde:: ser:: Error :: custom ( err. to_string ( ) ) ) ,
1100
+ } ;
1101
+
1088
1102
let options = self . options ;
1089
1103
let visited = & self . visited ;
1090
1104
visited. borrow_mut ( ) . insert ( self . table . to_pointer ( ) ) ;
@@ -1093,15 +1107,21 @@ impl<'a, 'lua> Serialize for SerializableTable<'a, 'lua> {
1093
1107
let len = self . table . raw_len ( ) ;
1094
1108
if len > 0 || self . table . is_array ( ) {
1095
1109
let mut seq = serializer. serialize_seq ( Some ( len) ) ?;
1096
- for value in self . table . clone ( ) . sequence_values_by_len :: < Value > ( None ) {
1097
- let value = & value . map_err ( serde :: ser :: Error :: custom ) ? ;
1098
- let skip = check_value_for_skip ( value, self . options , & self . visited )
1099
- . map_err ( serde :: ser :: Error :: custom ) ?;
1110
+ let mut serialize_err = None ;
1111
+ let res = self . table . for_each_value :: < Value > ( |value| {
1112
+ let skip = check_value_for_skip ( & value, self . options , & self . visited )
1113
+ . map_err ( |err| Error :: SerializeError ( err . to_string ( ) ) ) ?;
1100
1114
if skip {
1101
- continue ;
1115
+ // continue iteration
1116
+ return Ok ( ( ) ) ;
1102
1117
}
1103
- seq. serialize_element ( & SerializableValue :: new ( value, options, Some ( visited) ) ) ?;
1104
- }
1118
+ seq. serialize_element ( & SerializableValue :: new ( & value, options, Some ( visited) ) )
1119
+ . map_err ( |err| {
1120
+ serialize_err = Some ( err) ;
1121
+ Error :: SerializeError ( String :: new ( ) )
1122
+ } )
1123
+ } ) ;
1124
+ convert_result ( res, serialize_err) ?;
1105
1125
return seq. end ( ) ;
1106
1126
}
1107
1127
@@ -1138,18 +1158,7 @@ impl<'a, 'lua> Serialize for SerializableTable<'a, 'lua> {
1138
1158
process_pair ( key, value)
1139
1159
} )
1140
1160
} ;
1141
- match res {
1142
- Ok ( _) => { }
1143
- Err ( Error :: SerializeError ( _) ) if serialize_err. is_some ( ) => {
1144
- return Err ( serialize_err. unwrap ( ) ) ;
1145
- }
1146
- Err ( Error :: SerializeError ( msg) ) => {
1147
- return Err ( serde:: ser:: Error :: custom ( msg) ) ;
1148
- }
1149
- Err ( err) => {
1150
- return Err ( serde:: ser:: Error :: custom ( err. to_string ( ) ) ) ;
1151
- }
1152
- }
1161
+ convert_result ( res, serialize_err) ?;
1153
1162
map. end ( )
1154
1163
}
1155
1164
}
@@ -1219,9 +1228,9 @@ where
1219
1228
///
1220
1229
/// [`Table::sequence_values`]: crate::Table::sequence_values
1221
1230
pub struct TableSequence < ' lua , V > {
1231
+ // TODO: Use `&Table`
1222
1232
table : LuaRef < ' lua > ,
1223
1233
index : Integer ,
1224
- len : Option < Integer > ,
1225
1234
_phantom : PhantomData < V > ,
1226
1235
}
1227
1236
@@ -1242,7 +1251,7 @@ where
1242
1251
1243
1252
lua. push_ref ( & self . table ) ;
1244
1253
match ffi:: lua_rawgeti ( state, -1 , self . index ) {
1245
- ffi:: LUA_TNIL if self . index > self . len . unwrap_or ( 0 ) => None ,
1254
+ ffi:: LUA_TNIL => None ,
1246
1255
_ => {
1247
1256
self . index += 1 ;
1248
1257
Some ( V :: from_stack ( -1 , lua) )
0 commit comments