Sha256: ae726aa729637083599e40f4339edc32336c35d743a17f4a78c93889970185e6

Contents?: true

Size: 1.33 KB

Versions: 2

Compression:

Stored size: 1.33 KB

Contents

# frozen_string_literal: true

require 'active_support/core_ext/array/wrap'
require 'active_support/core_ext/object/try'

class ActiveSet
  class Instructions
    class Entry
      class KeyPath
        attr_reader :path

        def initialize(path)
          # `path` can be an Array (e.g. [:parent, :child, :grandchild])
          # or a String (e.g. 'parent.child.grandchild')
          @path = path.is_a?(String) ? path.split('.') : Array.wrap(path).map(&:to_s)
        end

        def attribute
          attribute = @path.last
          return attribute.sub(operator_regex, '') if attribute.match operator_regex
          attribute
        end

        def operator
          attribute = @path.last
          return attribute[operator_regex, 1] if attribute.match operator_regex
          '=='
        end

        def associations_array
          @path.slice(0, @path.length - 1)
        end

        def associations_hash
          associations_array.reverse.reduce({}) { |a, e| { e => a } }
        end

        def value_for(item:)
          resource_for(item: item).send(attribute)
        rescue
          nil
        end

        def resource_for(item:)
          associations_array.reduce(item, :try)
        rescue
          nil
        end

        private

        def operator_regex
          /\((.*?)\)/
        end
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
activeset-0.4.0 lib/active_set/instructions/entry/keypath.rb
activeset-0.3.1 lib/active_set/instructions/entry/keypath.rb