lib/posthog/feature_flag.rb



# frozen_string_literal: true

# Represents a feature flag returned by /flags v2
module PostHog
  class FeatureFlag
    attr_reader :key, :enabled, :variant, :reason, :metadata

    def initialize(json)
      json.transform_keys!(&:to_s)
      @key = json['key']
      @enabled = json['enabled']
      @variant = json['variant']
      @reason = json['reason'] ? EvaluationReason.new(json['reason']) : nil
      @metadata = json['metadata'] ? FeatureFlagMetadata.new(json['metadata'].transform_keys(&:to_s)) : nil
    end

    # TODO: Rename to `value` in future version
    def get_value # rubocop:disable Naming/AccessorMethodName
      @variant || @enabled
    end

    def payload
      @metadata&.payload
    end

    def self.from_value_and_payload(key, value, payload)
      new({
            'key' => key,
            'enabled' => value.is_a?(String) || value,
            'variant' => value.is_a?(String) ? value : nil,
            'reason' => nil,
            'metadata' => {
              'id' => nil,
              'version' => nil,
              'payload' => payload,
              'description' => nil
            }
          })
    end
  end

  # Represents the reason why a flag was enabled/disabled
  class EvaluationReason
    attr_reader :code, :description, :condition_index

    def initialize(json)
      json.transform_keys!(&:to_s)
      @code = json['code']
      @description = json['description']
      @condition_index = json['condition_index'].to_i if json['condition_index']
    end
  end

  # Represents metadata about a feature flag
  class FeatureFlagMetadata
    attr_reader :id, :version, :payload, :description

    def initialize(json)
      json.transform_keys!(&:to_s)
      @id = json['id']
      @version = json['version']
      @payload = json['payload']
      @description = json['description']
    end
  end
end