Sha256: a07a7a743519a7c54ab13b2345140291cdd94200593a12d6c573e18cfb287e93

Contents?: true

Size: 1.57 KB

Versions: 1

Compression:

Stored size: 1.57 KB

Contents

# frozen_string_literal: true

module Rubanok
  class Rule # :nodoc:
    UNDEFINED = Object.new

    attr_reader :owner, :fields, :activate_on, :activate_always, :ignore_empty_values, :filter_with

    def initialize(fields, activate_on: fields, activate_always: false, ignore_empty_values: Rubanok.ignore_empty_values, filter_with: nil)
      @owner = owner
      @fields = fields.freeze
      @activate_on = Array(activate_on).freeze
      @activate_always = activate_always
      @ignore_empty_values = ignore_empty_values
      @filter_with = filter_with
    end

    def project(params)
      fields.each_with_object({}) do |field, acc|
        val = fetch_value params, field
        next acc if val == UNDEFINED

        acc[field] = val
        acc
      end
    end

    def applicable?(params)
      return true if activate_always == true

      activate_on.all? { |field| fetch_value(params, field) != UNDEFINED }
    end

    def to_method_name
      @method_name ||= build_method_name
    end

    private

    def build_method_name
      "__#{fields.join("_")}__"
    end

    def fetch_value(params, field)
      return UNDEFINED unless params.key?(field)

      val = params[field]

      val = filter_with.call(val) if filter_with

      return UNDEFINED if empty?(val)

      val
    end

    using(Module.new do
      refine NilClass do
        def empty?
          true
        end
      end

      refine Object do
        def empty?
          false
        end
      end
    end)

    def empty?(val)
      return false unless ignore_empty_values

      val.empty?
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
rubanok-0.3.0 lib/rubanok/rule.rb