@@ -200,45 +200,44 @@ impl MainPodBuilder {
200200 /// - {Dict,Array,Set}Contains/NotContains becomes Contains/NotContains.
201201 /// - GtEqFromEntries/GtFromEntries/GtToNotEqual becomes
202202 /// LtEqFromEntries/LtFromEntries/LtToNotEqual.
203- fn lower_op ( op : Operation ) -> Operation {
203+ fn lower_op ( op : Operation ) -> Result < Operation > {
204204 use NativeOperation :: * ;
205205 use OperationType :: * ;
206+ let op_type = op. 0 . clone ( ) ;
206207 match op. 0 {
207- Native ( DictContainsFromEntries ) => {
208- let [ dict, key, value] = op. 1 . try_into ( ) . unwrap ( ) ; // TODO: Error handling
208+ Native ( DictContainsFromEntries ) => <[ _ ; 3 ] >:: try_from ( op. 1 ) . map ( |[ dict, key, value] | {
209209 Operation ( Native ( ContainsFromEntries ) , vec ! [ dict, key, value] , op. 2 )
210- }
211- Native ( DictNotContainsFromEntries ) => {
212- let [ dict, key] = op. 1 . try_into ( ) . unwrap ( ) ; // TODO: Error handling
210+ } ) ,
211+ Native ( DictNotContainsFromEntries ) => <[ _ ; 2 ] >:: try_from ( op. 1 ) . map ( |[ dict, key] | {
213212 Operation ( Native ( NotContainsFromEntries ) , vec ! [ dict, key] , op. 2 )
214- }
215- Native ( SetContainsFromEntries ) => {
216- let [ set, value] = op. 1 . try_into ( ) . unwrap ( ) ; // TODO: Error handling
213+ } ) ,
214+ Native ( SetContainsFromEntries ) => <[ _ ; 2 ] >:: try_from ( op. 1 ) . map ( |[ set, value] | {
217215 Operation (
218216 Native ( ContainsFromEntries ) ,
219217 vec ! [ set, value. clone( ) , value] ,
220218 op. 2 ,
221219 )
222- }
223- Native ( SetNotContainsFromEntries ) => {
224- let [ set, value] = op. 1 . try_into ( ) . unwrap ( ) ; // TODO: Error handling
220+ } ) ,
221+ Native ( SetNotContainsFromEntries ) => <[ _ ; 2 ] >:: try_from ( op. 1 ) . map ( |[ set, value] | {
225222 Operation ( Native ( NotContainsFromEntries ) , vec ! [ set, value] , op. 2 )
226- }
223+ } ) ,
227224 Native ( ArrayContainsFromEntries ) => {
228- let [ array, index, value] = op. 1 . try_into ( ) . unwrap ( ) ; // TODO: Error handling
229- Operation ( Native ( ContainsFromEntries ) , vec ! [ array, index, value] , op. 2 )
225+ <[ _ ; 3 ] >:: try_from ( op. 1 ) . map ( |[ array, index, value] | {
226+ Operation ( Native ( ContainsFromEntries ) , vec ! [ array, index, value] , op. 2 )
227+ } )
230228 }
231- Native ( GtEqFromEntries ) => {
232- let [ entry1, entry2] = op. 1 . try_into ( ) . unwrap ( ) ; // TODO: Error handling
229+ Native ( GtEqFromEntries ) => <[ _ ; 2 ] >:: try_from ( op. 1 ) . map ( |[ entry1, entry2] | {
233230 Operation ( Native ( LtEqFromEntries ) , vec ! [ entry2, entry1] , op. 2 )
234- }
235- Native ( GtFromEntries ) => {
236- let [ entry1, entry2] = op. 1 . try_into ( ) . unwrap ( ) ; // TODO: Error handling
231+ } ) ,
232+ Native ( GtFromEntries ) => <[ _ ; 2 ] >:: try_from ( op. 1 ) . map ( |[ entry1, entry2] | {
237233 Operation ( Native ( LtFromEntries ) , vec ! [ entry2, entry1] , op. 2 )
238- }
239- Native ( GtToNotEqual ) => Operation ( Native ( LtToNotEqual ) , op. 1 , op. 2 ) ,
240- _ => op ,
234+ } ) ,
235+ Native ( GtToNotEqual ) => Ok ( Operation ( Native ( LtToNotEqual ) , op. 1 , op. 2 ) ) ,
236+ _ => Ok ( op ) ,
241237 }
238+ . map_err ( |_| {
239+ Error :: op_invalid_args ( format ! ( "Invalid arg count in operation {:?}" , op_type) )
240+ } )
242241 }
243242
244243 /// Fills in auxiliary data if necessary/possible.
@@ -494,7 +493,7 @@ impl MainPodBuilder {
494493 }
495494
496495 fn op ( & mut self , public : bool , op : Operation ) -> Result < Statement > {
497- let op = Self :: fill_in_aux ( Self :: lower_op ( op) ) ?;
496+ let op = Self :: fill_in_aux ( Self :: lower_op ( op) ? ) ?;
498497 let st = self . op_statement ( op. clone ( ) ) ?;
499498 self . insert ( public, ( st, op) ) ;
500499
0 commit comments