11use crate :: compiler:: prelude:: * ;
22use crate :: stdlib:: string_utils:: convert_to_string;
3+ use crate :: stdlib:: util:: BoolConstOrExpr ;
34
45static DEFAULT_CASE_SENSITIVE : Value = Value :: Boolean ( true ) ;
56
@@ -18,8 +19,7 @@ const PARAMETERS: &[Parameter] = &[
1819 . default ( & DEFAULT_CASE_SENSITIVE ) ,
1920] ;
2021
21- fn contains ( value : & Value , substring : & Value , case_sensitive : Value ) -> Resolved {
22- let case_sensitive = case_sensitive. try_boolean ( ) ?;
22+ fn contains ( value : & Value , substring : & Value , case_sensitive : bool ) -> Resolved {
2323 let value = convert_to_string ( value, !case_sensitive) ?;
2424 let substring = convert_to_string ( substring, !case_sensitive) ?;
2525 Ok ( value. contains ( substring. as_ref ( ) ) . into ( ) )
@@ -51,13 +51,17 @@ impl Function for Contains {
5151
5252 fn compile (
5353 & self ,
54- _state : & state:: TypeState ,
54+ state : & state:: TypeState ,
5555 _ctx : & mut FunctionCompileContext ,
5656 arguments : ArgumentList ,
5757 ) -> Compiled {
5858 let value = arguments. required ( "value" ) ;
5959 let substring = arguments. required ( "substring" ) ;
60- let case_sensitive = arguments. optional ( "case_sensitive" ) ;
60+ let case_sensitive = BoolConstOrExpr :: new_with_default (
61+ arguments. optional ( "case_sensitive" ) ,
62+ state,
63+ & DEFAULT_CASE_SENSITIVE ,
64+ ) ?;
6165
6266 Ok ( ContainsFn {
6367 value,
@@ -87,16 +91,14 @@ impl Function for Contains {
8791struct ContainsFn {
8892 value : Box < dyn Expression > ,
8993 substring : Box < dyn Expression > ,
90- case_sensitive : Option < Box < dyn Expression > > ,
94+ case_sensitive : BoolConstOrExpr ,
9195}
9296
9397impl FunctionExpression for ContainsFn {
9498 fn resolve ( & self , ctx : & mut Context ) -> Resolved {
9599 let value = self . value . resolve ( ctx) ?;
96100 let substring = self . substring . resolve ( ctx) ?;
97- let case_sensitive = self
98- . case_sensitive
99- . map_resolve_with_default ( ctx, || DEFAULT_CASE_SENSITIVE . clone ( ) ) ?;
101+ let case_sensitive = self . case_sensitive . resolve ( ctx) ?;
100102
101103 contains ( & value, & substring, case_sensitive)
102104 }
@@ -190,5 +192,14 @@ mod tests {
190192 want: Ok ( value!( true ) ) ,
191193 tdef: TypeDef :: boolean( ) . infallible( ) ,
192194 }
195+
196+ case_insensitive_invalid_type {
197+ args: func_args![ value: value!( "foobar" ) ,
198+ substring: value!( "BAR" ) ,
199+ case_sensitive: value!( "no" )
200+ ] ,
201+ want: Err ( "expected boolean, got string" ) ,
202+ tdef: TypeDef :: boolean( ) . infallible( ) ,
203+ }
193204 ] ;
194205}
0 commit comments