@@ -58,14 +58,20 @@ impl Operation {
5858 . 1
5959 . iter ( )
6060 . flat_map ( |arg| match arg {
61- OperationArg :: None => vec ! [ ] ,
62- OperationArg :: Index ( i) => {
63- vec ! [ statements[ * i] . clone( ) . try_into( ) ]
64- }
61+ OperationArg :: None => None ,
62+ OperationArg :: Index ( i) => Some ( statements[ * i] . clone ( ) . try_into ( ) ) ,
6563 } )
6664 . collect :: < Result < Vec < crate :: middleware:: Statement > > > ( ) ?;
6765 middleware:: Operation :: op ( self . 0 , & deref_args)
6866 }
67+ /// Argument method. Trailing Nones are filtered out.
68+ pub fn args ( & self ) -> Vec < OperationArg > {
69+ let maybe_last_arg_index = ( 0 ..self . 1 . len ( ) ) . rev ( ) . find ( |i| !self . 1 [ * i] . is_none ( ) ) ;
70+ match maybe_last_arg_index {
71+ None => vec ! [ ] ,
72+ Some ( i) => self . 1 [ 0 ..i + 1 ] . to_vec ( ) ,
73+ }
74+ }
6975}
7076
7177#[ derive( Clone , Debug , PartialEq , Eq ) ]
@@ -75,6 +81,14 @@ impl Statement {
7581 pub fn is_none ( & self ) -> bool {
7682 self . 0 == NativeStatement :: None
7783 }
84+ /// Argument method. Trailing Nones are filtered out.
85+ pub fn args ( & self ) -> Vec < StatementArg > {
86+ let maybe_last_arg_index = ( 0 ..self . 1 . len ( ) ) . rev ( ) . find ( |i| !self . 1 [ * i] . is_none ( ) ) ;
87+ match maybe_last_arg_index {
88+ None => vec ! [ ] ,
89+ Some ( i) => self . 1 [ 0 ..i + 1 ] . to_vec ( ) ,
90+ }
91+ }
7892}
7993
8094impl ToFields for Statement {
@@ -102,29 +116,30 @@ impl TryFrom<Statement> for middleware::Statement {
102116 type S = middleware:: Statement ;
103117 type NS = NativeStatement ;
104118 type SA = StatementArg ;
119+ let proper_args = s. args ( ) ;
105120 let args = (
106- s . 1 . get ( 0 ) . cloned ( ) ,
107- s . 1 . get ( 1 ) . cloned ( ) ,
108- s . 1 . get ( 2 ) . cloned ( ) ,
121+ proper_args . get ( 0 ) . cloned ( ) ,
122+ proper_args . get ( 1 ) . cloned ( ) ,
123+ proper_args . get ( 2 ) . cloned ( ) ,
109124 ) ;
110- Ok ( match ( s. 0 , args) {
111- ( NS :: None , _) => S :: None ,
112- ( NS :: ValueOf , ( Some ( SA :: Key ( ak) ) , Some ( SA :: Literal ( v) ) , _) ) => S :: ValueOf ( ak, v) ,
113- ( NS :: Equal , ( Some ( SA :: Key ( ak1) ) , Some ( SA :: Key ( ak2) ) , _) ) => S :: Equal ( ak1, ak2) ,
114- ( NS :: NotEqual , ( Some ( SA :: Key ( ak1) ) , Some ( SA :: Key ( ak2) ) , _) ) => S :: NotEqual ( ak1, ak2) ,
115- ( NS :: Gt , ( Some ( SA :: Key ( ak1) ) , Some ( SA :: Key ( ak2) ) , _) ) => S :: Gt ( ak1, ak2) ,
116- ( NS :: Lt , ( Some ( SA :: Key ( ak1) ) , Some ( SA :: Key ( ak2) ) , _) ) => S :: Lt ( ak1, ak2) ,
117- ( NS :: Contains , ( Some ( SA :: Key ( ak1) ) , Some ( SA :: Key ( ak2) ) , _) ) => S :: Contains ( ak1, ak2) ,
118- ( NS :: NotContains , ( Some ( SA :: Key ( ak1) ) , Some ( SA :: Key ( ak2) ) , _) ) => {
125+ Ok ( match ( s. 0 , args, proper_args . len ( ) ) {
126+ ( NS :: None , _, 0 ) => S :: None ,
127+ ( NS :: ValueOf , ( Some ( SA :: Key ( ak) ) , Some ( SA :: Literal ( v) ) , _) , 2 ) => S :: ValueOf ( ak, v) ,
128+ ( NS :: Equal , ( Some ( SA :: Key ( ak1) ) , Some ( SA :: Key ( ak2) ) , _) , 2 ) => S :: Equal ( ak1, ak2) ,
129+ ( NS :: NotEqual , ( Some ( SA :: Key ( ak1) ) , Some ( SA :: Key ( ak2) ) , _) , 2 ) => S :: NotEqual ( ak1, ak2) ,
130+ ( NS :: Gt , ( Some ( SA :: Key ( ak1) ) , Some ( SA :: Key ( ak2) ) , _) , 2 ) => S :: Gt ( ak1, ak2) ,
131+ ( NS :: Lt , ( Some ( SA :: Key ( ak1) ) , Some ( SA :: Key ( ak2) ) , _) , 2 ) => S :: Lt ( ak1, ak2) ,
132+ ( NS :: Contains , ( Some ( SA :: Key ( ak1) ) , Some ( SA :: Key ( ak2) ) , _) , 2 ) => S :: Contains ( ak1, ak2) ,
133+ ( NS :: NotContains , ( Some ( SA :: Key ( ak1) ) , Some ( SA :: Key ( ak2) ) , _) , 2 ) => {
119134 S :: NotContains ( ak1, ak2)
120135 }
121- ( NS :: SumOf , ( Some ( SA :: Key ( ak1) ) , Some ( SA :: Key ( ak2) ) , Some ( SA :: Key ( ak3) ) ) ) => {
136+ ( NS :: SumOf , ( Some ( SA :: Key ( ak1) ) , Some ( SA :: Key ( ak2) ) , Some ( SA :: Key ( ak3) ) ) , 3 ) => {
122137 S :: SumOf ( ak1, ak2, ak3)
123138 }
124- ( NS :: ProductOf , ( Some ( SA :: Key ( ak1) ) , Some ( SA :: Key ( ak2) ) , Some ( SA :: Key ( ak3) ) ) ) => {
139+ ( NS :: ProductOf , ( Some ( SA :: Key ( ak1) ) , Some ( SA :: Key ( ak2) ) , Some ( SA :: Key ( ak3) ) ) , 3 ) => {
125140 S :: ProductOf ( ak1, ak2, ak3)
126141 }
127- ( NS :: MaxOf , ( Some ( SA :: Key ( ak1) ) , Some ( SA :: Key ( ak2) ) , Some ( SA :: Key ( ak3) ) ) ) => {
142+ ( NS :: MaxOf , ( Some ( SA :: Key ( ak1) ) , Some ( SA :: Key ( ak2) ) , Some ( SA :: Key ( ak3) ) ) , 3 ) => {
128143 S :: MaxOf ( ak1, ak2, ak3)
129144 }
130145 _ => Err ( anyhow ! ( "Ill-formed statement expression {:?}" , s) ) ?,
0 commit comments