@@ -11,7 +11,10 @@ use std::{
1111 cell:: RefCell ,
1212 ffi:: { c_int, CString } ,
1313} ;
14- use superposition_types:: DimensionInfo ;
14+ use superposition_types:: {
15+ logic:: { evaluate_local_cohorts, evaluate_local_cohorts_skip_unresolved} ,
16+ DimensionInfo ,
17+ } ;
1518use tokio:: { runtime:: Runtime , task} ;
1619
1720thread_local ! {
@@ -216,6 +219,7 @@ pub extern "C" fn expt_get_applicable_variant(
216219#[ no_mangle]
217220pub extern "C" fn expt_get_satisfied_experiments (
218221 client : * mut Arc < Client > ,
222+ c_dimensions : * const c_char ,
219223 c_context : * const c_char ,
220224 filter_prefix : * const c_char ,
221225) -> * mut c_char {
@@ -227,6 +231,16 @@ pub extern "C" fn expt_get_satisfied_experiments(
227231 return std:: ptr:: null_mut( )
228232 ) ;
229233
234+ let dimensions = unwrap_safe ! (
235+ cstring_to_rstring( c_dimensions) ,
236+ return std:: ptr:: null_mut( )
237+ ) ;
238+
239+ let dimensions = unwrap_safe ! (
240+ serde_json:: from_str:: <HashMap <String , DimensionInfo >>( dimensions. as_str( ) ) ,
241+ return std:: ptr:: null_mut( )
242+ ) ;
243+
230244 let prefix_list = if filter_prefix. is_null ( ) {
231245 None
232246 } else {
@@ -238,6 +252,11 @@ pub extern "C" fn expt_get_satisfied_experiments(
238252 Some ( prefix_list)
239253 } ;
240254
255+ let context = Value :: Object ( evaluate_local_cohorts (
256+ & dimensions,
257+ & context. as_object ( ) . cloned ( ) . unwrap_or_default ( ) ,
258+ ) ) ;
259+
241260 let local = task:: LocalSet :: new ( ) ;
242261 local. block_on ( & Runtime :: new ( ) . unwrap ( ) , async move {
243262 unsafe {
@@ -258,6 +277,7 @@ pub extern "C" fn expt_get_satisfied_experiments(
258277#[ no_mangle]
259278pub extern "C" fn expt_get_filtered_satisfied_experiments (
260279 client : * mut Arc < Client > ,
280+ c_dimensions : * const c_char ,
261281 c_context : * const c_char ,
262282 filter_prefix : * const c_char ,
263283) -> * mut c_char {
@@ -268,6 +288,17 @@ pub extern "C" fn expt_get_filtered_satisfied_experiments(
268288 serde_json:: from_str:: <Value >( context. as_str( ) ) ,
269289 return std:: ptr:: null_mut( )
270290 ) ;
291+
292+ let dimensions = unwrap_safe ! (
293+ cstring_to_rstring( c_dimensions) ,
294+ return std:: ptr:: null_mut( )
295+ ) ;
296+
297+ let dimensions = unwrap_safe ! (
298+ serde_json:: from_str:: <HashMap <String , DimensionInfo >>( dimensions. as_str( ) ) ,
299+ return std:: ptr:: null_mut( )
300+ ) ;
301+
271302 let prefix_list = if filter_prefix. is_null ( ) {
272303 None
273304 } else {
@@ -280,6 +311,12 @@ pub extern "C" fn expt_get_filtered_satisfied_experiments(
280311
281312 Some ( prefix_list) . filter ( |list| !list. is_empty ( ) )
282313 } ;
314+
315+ let context = Value :: Object ( evaluate_local_cohorts_skip_unresolved (
316+ & dimensions,
317+ & context. as_object ( ) . cloned ( ) . unwrap_or_default ( ) ,
318+ ) ) ;
319+
283320 let local = task:: LocalSet :: new ( ) ;
284321 local. block_on ( & Runtime :: new ( ) . unwrap ( ) , async move {
285322 unsafe {
0 commit comments