@@ -24,6 +24,8 @@ import (
2424 "google.golang.org/protobuf/types/known/structpb"
2525)
2626
27+ const errSettingResponseResult = "error setting response result: %w"
28+
2729type FlagEvaluationServiceV2 struct {
2830 logger * logger.Logger
2931 eval evaluator.IEvaluator
@@ -244,28 +246,52 @@ func resolveV2[T constraints](ctx context.Context, logger *logger.Logger, resolv
244246 spanFromContext := trace .SpanFromContext (ctx )
245247 spanFromContext .SetAttributes (telemetry .SemConvFeatureFlagAttributes (flagKey , variant )... )
246248
247- if reason == model .FallbackReason {
248- if respV2 , ok := resp .(responseV2 [T ]); ok {
249- if err := respV2 .SetReasonOnly (model .DefaultReason , metadata ); err != nil {
250- logger .ErrorWithID (reqID , err .Error ())
251- return fmt .Errorf ("error setting response result: %w" , err )
252- }
253- }
254- } else if reason == model .DisabledReason {
255- if respV2 , ok := resp .(responseV2 [T ]); ok {
256- if err := respV2 .SetReasonOnly (model .DisabledReason , metadata ); err != nil {
257- logger .ErrorWithID (reqID , err .Error ())
258- return fmt .Errorf ("error setting response result: %w" , err )
259- }
260- }
261- } else {
249+ if err := applyResolveV2Response (logger , reqID , resp , result , variant , reason , metadata , evalErr ); err != nil {
250+ return err
251+ }
252+
253+ return evalErrFormatted
254+ }
255+
256+ func applyResolveV2Response [T constraints ](
257+ logger * logger.Logger ,
258+ reqID string ,
259+ resp response [T ],
260+ result T ,
261+ variant , reason string ,
262+ metadata map [string ]interface {},
263+ evalErr error ,
264+ ) error {
265+ switch reason {
266+ case model .FallbackReason :
267+ return setResolveV2ReasonOnly (logger , reqID , resp , model .DefaultReason , metadata )
268+ case model .DisabledReason :
269+ return setResolveV2ReasonOnly (logger , reqID , resp , model .DisabledReason , metadata )
270+ default :
262271 if err := resp .SetResult (result , variant , reason , metadata ); err != nil && evalErr == nil {
263272 logger .ErrorWithID (reqID , err .Error ())
264- return fmt .Errorf ("error setting response result: %w" , err )
273+ return fmt .Errorf (errSettingResponseResult , err )
265274 }
266275 }
276+ return nil
277+ }
267278
268- return evalErrFormatted
279+ func setResolveV2ReasonOnly [T constraints ](
280+ logger * logger.Logger ,
281+ reqID string ,
282+ resp response [T ],
283+ reason string ,
284+ metadata map [string ]interface {},
285+ ) error {
286+ respV2 , ok := resp .(responseV2 [T ])
287+ if ! ok {
288+ return nil
289+ }
290+ if err := respV2 .SetReasonOnly (reason , metadata ); err != nil {
291+ logger .ErrorWithID (reqID , err .Error ())
292+ return fmt .Errorf (errSettingResponseResult , err )
293+ }
294+ return nil
269295}
270296
271297// startResolveV2 initialises tracing and selector context common to every Resolve* method.
0 commit comments