1+ use :: flagd_evaluator:: evaluation:: {
2+ evaluate_bool_flag, evaluate_flag, evaluate_float_flag, evaluate_int_flag, evaluate_string_flag,
3+ } ;
4+ use :: flagd_evaluator:: model:: ParsingResult ;
15use pyo3:: prelude:: * ;
26use pyo3:: types:: PyDict ;
37use serde_json:: Value ;
4- use :: flagd_evaluator:: model:: ParsingResult ;
5- use :: flagd_evaluator:: evaluation:: { evaluate_flag, evaluate_bool_flag, evaluate_string_flag, evaluate_int_flag, evaluate_float_flag} ;
68
79/// FlagEvaluator - Stateful feature flag evaluator
810///
@@ -48,16 +50,20 @@ impl FlagEvaluator {
4850 let config_value: Value = pythonize:: depythonize ( config) ?;
4951
5052 // Convert to JSON string for parsing
51- let config_str = serde_json:: to_string ( & config_value)
52- . map_err ( |e| PyErr :: new :: < pyo3:: exceptions:: PyValueError , _ > (
53- format ! ( "Failed to serialize config: {}" , e)
54- ) ) ?;
53+ let config_str = serde_json:: to_string ( & config_value) . map_err ( |e| {
54+ PyErr :: new :: < pyo3:: exceptions:: PyValueError , _ > ( format ! (
55+ "Failed to serialize config: {}" ,
56+ e
57+ ) )
58+ } ) ?;
5559
5660 // Parse the configuration
57- let parsing_result = ParsingResult :: parse ( & config_str)
58- . map_err ( |e| PyErr :: new :: < pyo3:: exceptions:: PyValueError , _ > (
59- format ! ( "Failed to parse config: {}" , e)
60- ) ) ?;
61+ let parsing_result = ParsingResult :: parse ( & config_str) . map_err ( |e| {
62+ PyErr :: new :: < pyo3:: exceptions:: PyValueError , _ > ( format ! (
63+ "Failed to parse config: {}" ,
64+ e
65+ ) )
66+ } ) ?;
6167
6268 // Store the state
6369 self . state = Some ( parsing_result. clone ( ) ) ;
@@ -77,16 +83,16 @@ impl FlagEvaluator {
7783 /// Returns:
7884 /// dict: Evaluation result with value, variant, reason, and metadata
7985 fn evaluate ( & self , py : Python , flag_key : String , context : & PyDict ) -> PyResult < PyObject > {
80- let state = self . state . as_ref ( )
81- . ok_or_else ( || PyErr :: new :: < pyo3:: exceptions:: PyRuntimeError , _ > (
82- "No state loaded. Call update_state() first."
83- ) ) ?;
86+ let state = self . state . as_ref ( ) . ok_or_else ( || {
87+ PyErr :: new :: < pyo3:: exceptions:: PyRuntimeError , _ > (
88+ "No state loaded. Call update_state() first." ,
89+ )
90+ } ) ?;
8491
8592 // Look up the flag
86- let flag = state. flags . get ( & flag_key)
87- . ok_or_else ( || PyErr :: new :: < pyo3:: exceptions:: PyKeyError , _ > (
88- format ! ( "Flag not found: {}" , flag_key)
89- ) ) ?;
93+ let flag = state. flags . get ( & flag_key) . ok_or_else ( || {
94+ PyErr :: new :: < pyo3:: exceptions:: PyKeyError , _ > ( format ! ( "Flag not found: {}" , flag_key) )
95+ } ) ?;
9096
9197 // Convert context to JSON Value
9298 let context_value: Value = pythonize:: depythonize ( context) ?;
@@ -95,8 +101,12 @@ impl FlagEvaluator {
95101 let result = evaluate_flag ( flag, & context_value, & state. flag_set_metadata ) ;
96102
97103 // Convert result to Python dict
98- pythonize:: pythonize ( py, & result)
99- . map_err ( |e| PyErr :: new :: < pyo3:: exceptions:: PyValueError , _ > ( format ! ( "Failed to convert result: {}" , e) ) )
104+ pythonize:: pythonize ( py, & result) . map_err ( |e| {
105+ PyErr :: new :: < pyo3:: exceptions:: PyValueError , _ > ( format ! (
106+ "Failed to convert result: {}" ,
107+ e
108+ ) )
109+ } )
100110 }
101111
102112 /// Evaluate a boolean flag
@@ -108,16 +118,21 @@ impl FlagEvaluator {
108118 ///
109119 /// Returns:
110120 /// bool: The evaluated boolean value
111- fn evaluate_bool ( & self , flag_key : String , context : & PyDict , default_value : bool ) -> PyResult < bool > {
112- let state = self . state . as_ref ( )
113- . ok_or_else ( || PyErr :: new :: < pyo3:: exceptions:: PyRuntimeError , _ > (
114- "No state loaded. Call update_state() first."
115- ) ) ?;
121+ fn evaluate_bool (
122+ & self ,
123+ flag_key : String ,
124+ context : & PyDict ,
125+ default_value : bool ,
126+ ) -> PyResult < bool > {
127+ let state = self . state . as_ref ( ) . ok_or_else ( || {
128+ PyErr :: new :: < pyo3:: exceptions:: PyRuntimeError , _ > (
129+ "No state loaded. Call update_state() first." ,
130+ )
131+ } ) ?;
116132
117- let flag = state. flags . get ( & flag_key)
118- . ok_or_else ( || PyErr :: new :: < pyo3:: exceptions:: PyKeyError , _ > (
119- format ! ( "Flag not found: {}" , flag_key)
120- ) ) ?;
133+ let flag = state. flags . get ( & flag_key) . ok_or_else ( || {
134+ PyErr :: new :: < pyo3:: exceptions:: PyKeyError , _ > ( format ! ( "Flag not found: {}" , flag_key) )
135+ } ) ?;
121136
122137 let context_value: Value = pythonize:: depythonize ( context) ?;
123138 let result = evaluate_bool_flag ( flag, & context_value, & state. flag_set_metadata ) ;
@@ -137,16 +152,21 @@ impl FlagEvaluator {
137152 ///
138153 /// Returns:
139154 /// str: The evaluated string value
140- fn evaluate_string ( & self , flag_key : String , context : & PyDict , default_value : String ) -> PyResult < String > {
141- let state = self . state . as_ref ( )
142- . ok_or_else ( || PyErr :: new :: < pyo3:: exceptions:: PyRuntimeError , _ > (
143- "No state loaded. Call update_state() first."
144- ) ) ?;
155+ fn evaluate_string (
156+ & self ,
157+ flag_key : String ,
158+ context : & PyDict ,
159+ default_value : String ,
160+ ) -> PyResult < String > {
161+ let state = self . state . as_ref ( ) . ok_or_else ( || {
162+ PyErr :: new :: < pyo3:: exceptions:: PyRuntimeError , _ > (
163+ "No state loaded. Call update_state() first." ,
164+ )
165+ } ) ?;
145166
146- let flag = state. flags . get ( & flag_key)
147- . ok_or_else ( || PyErr :: new :: < pyo3:: exceptions:: PyKeyError , _ > (
148- format ! ( "Flag not found: {}" , flag_key)
149- ) ) ?;
167+ let flag = state. flags . get ( & flag_key) . ok_or_else ( || {
168+ PyErr :: new :: < pyo3:: exceptions:: PyKeyError , _ > ( format ! ( "Flag not found: {}" , flag_key) )
169+ } ) ?;
150170
151171 let context_value: Value = pythonize:: depythonize ( context) ?;
152172 let result = evaluate_string_flag ( flag, & context_value, & state. flag_set_metadata ) ;
@@ -166,16 +186,21 @@ impl FlagEvaluator {
166186 ///
167187 /// Returns:
168188 /// int: The evaluated integer value
169- fn evaluate_int ( & self , flag_key : String , context : & PyDict , default_value : i64 ) -> PyResult < i64 > {
170- let state = self . state . as_ref ( )
171- . ok_or_else ( || PyErr :: new :: < pyo3:: exceptions:: PyRuntimeError , _ > (
172- "No state loaded. Call update_state() first."
173- ) ) ?;
189+ fn evaluate_int (
190+ & self ,
191+ flag_key : String ,
192+ context : & PyDict ,
193+ default_value : i64 ,
194+ ) -> PyResult < i64 > {
195+ let state = self . state . as_ref ( ) . ok_or_else ( || {
196+ PyErr :: new :: < pyo3:: exceptions:: PyRuntimeError , _ > (
197+ "No state loaded. Call update_state() first." ,
198+ )
199+ } ) ?;
174200
175- let flag = state. flags . get ( & flag_key)
176- . ok_or_else ( || PyErr :: new :: < pyo3:: exceptions:: PyKeyError , _ > (
177- format ! ( "Flag not found: {}" , flag_key)
178- ) ) ?;
201+ let flag = state. flags . get ( & flag_key) . ok_or_else ( || {
202+ PyErr :: new :: < pyo3:: exceptions:: PyKeyError , _ > ( format ! ( "Flag not found: {}" , flag_key) )
203+ } ) ?;
179204
180205 let context_value: Value = pythonize:: depythonize ( context) ?;
181206 let result = evaluate_int_flag ( flag, & context_value, & state. flag_set_metadata ) ;
@@ -195,16 +220,21 @@ impl FlagEvaluator {
195220 ///
196221 /// Returns:
197222 /// float: The evaluated float value
198- fn evaluate_float ( & self , flag_key : String , context : & PyDict , default_value : f64 ) -> PyResult < f64 > {
199- let state = self . state . as_ref ( )
200- . ok_or_else ( || PyErr :: new :: < pyo3:: exceptions:: PyRuntimeError , _ > (
201- "No state loaded. Call update_state() first."
202- ) ) ?;
203-
204- let flag = state. flags . get ( & flag_key)
205- . ok_or_else ( || PyErr :: new :: < pyo3:: exceptions:: PyKeyError , _ > (
206- format ! ( "Flag not found: {}" , flag_key)
207- ) ) ?;
223+ fn evaluate_float (
224+ & self ,
225+ flag_key : String ,
226+ context : & PyDict ,
227+ default_value : f64 ,
228+ ) -> PyResult < f64 > {
229+ let state = self . state . as_ref ( ) . ok_or_else ( || {
230+ PyErr :: new :: < pyo3:: exceptions:: PyRuntimeError , _ > (
231+ "No state loaded. Call update_state() first." ,
232+ )
233+ } ) ?;
234+
235+ let flag = state. flags . get ( & flag_key) . ok_or_else ( || {
236+ PyErr :: new :: < pyo3:: exceptions:: PyKeyError , _ > ( format ! ( "Flag not found: {}" , flag_key) )
237+ } ) ?;
208238
209239 let context_value: Value = pythonize:: depythonize ( context) ?;
210240 let result = evaluate_float_flag ( flag, & context_value, & state. flag_set_metadata ) ;
0 commit comments