Class: Hackle::TargetRuleExperimentFlowEvaluator

Inherits:
Object
  • Object
show all
Includes:
ExperimentFlowEvaluator
Defined in:
lib/hackle/internal/evaluation/evaluator/experiment/experiment_flow_evaluator.rb

Instance Method Summary collapse

Constructor Details

#initialize(target_rule_determiner:, action_resolver:) ⇒ TargetRuleExperimentFlowEvaluator

Returns a new instance of TargetRuleExperimentFlowEvaluator.

Parameters:



150
151
152
153
154
155
# File 'lib/hackle/internal/evaluation/evaluator/experiment/experiment_flow_evaluator.rb', line 150

def initialize(target_rule_determiner:, action_resolver:)
  # @type [ExperimentTargetRuleDeterminer]
  @target_rule_determiner = target_rule_determiner
  # @type [ExperimentActionResolver]
  @action_resolver = action_resolver
end

Instance Method Details

#evaluate(request, context, next_flow) ⇒ Object

Raises:

  • (ArgumentError)


157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
# File 'lib/hackle/internal/evaluation/evaluator/experiment/experiment_flow_evaluator.rb', line 157

def evaluate(request, context, next_flow)
  if request.experiment.status != ExperimentStatus::RUNNING
    raise ArgumentError, "experiment status must be RUNNING [#{request.experiment.id}]"
  end
  if request.experiment.type != ExperimentType::FEATURE_FLAG
    raise ArgumentError, "experiment type must be FEATURE_FLAG [#{request.experiment.id}]"
  end

  return next_flow.evaluate(request, context) if request.user.identifiers[request.experiment.identifier_type].nil?

  target_rule = @target_rule_determiner.determine_target_rule_or_nil(request, context)
  return next_flow.evaluate(request, context) if target_rule.nil?

  variation = @action_resolver.resolve_or_nil(request, target_rule.action)
  raise ArgumentError, "feature flag must decide the variation [#{request.experiment.id}]" if variation.nil?

  ExperimentEvaluation.create(request, context, variation, DecisionReason::TARGET_RULE_MATCH)
end