Sha256: 5b98565d8acba80790d5f342a8e27baa3c3dc13ab376cb8b2463098b77f59d5d

Contents?: true

Size: 1.15 KB

Versions: 14

Compression:

Stored size: 1.15 KB

Contents

# frozen_string_literal: true

require 'active_support/hash_with_indifferent_access'
require 'active_support/core_ext/object/blank'

module EacRubyUtils
  class Struct
    def initialize(initial_data = {})
      self.data = ::ActiveSupport::HashWithIndifferentAccess.new(initial_data)
    end

    def [](key)
      key, bool = parse_key(key)
      bool ? self[key].present? : data[key]
    end

    def fetch(key)
      key, bool = parse_key(key)
      bool ? fetch(key).present? : data.fetch(key)
    end

    def method_missing(method_name, *arguments, &block)
      property_method?(method_name) ? fetch(method_name) : super
    end

    def respond_to_missing?(method_name, include_private = false)
      property_method?(method_name) || super
    end

    def to_h
      data.dup
    end

    delegate :to_s, to: :data

    private

    attr_accessor :data

    def parse_key(key)
      m = /\A(.+)\?\z/.match(key.to_s)
      [(m ? m[1] : key.to_s).to_sym, m ? true : false]
    end

    def property_method?(key)
      property_methods.include?(key.to_sym)
    end

    def property_methods
      data.keys.flat_map { |k| [k.to_sym, "#{k}?".to_sym] }
    end
  end
end

Version data entries

14 entries across 14 versions & 3 rubygems

Version Path
eac_ruby_utils-0.48.0 lib/eac_ruby_utils/struct.rb
avm-tools-0.73.0 vendor/eac_ruby_utils/lib/eac_ruby_utils/struct.rb
avm-tools-0.72.0 vendor/eac_ruby_utils/lib/eac_ruby_utils/struct.rb
eac_ruby_utils-0.47.0 lib/eac_ruby_utils/struct.rb
avm-tools-0.71.0 vendor/eac_ruby_utils/lib/eac_ruby_utils/struct.rb
avm-tools-0.70.2 vendor/eac_ruby_utils/lib/eac_ruby_utils/struct.rb
ehbrs-tools-0.15.0 vendor/eac_ruby_utils/lib/eac_ruby_utils/struct.rb
ehbrs-tools-0.14.1 vendor/eac_ruby_utils/lib/eac_ruby_utils/struct.rb
avm-tools-0.70.1 vendor/eac_ruby_utils/lib/eac_ruby_utils/struct.rb
avm-tools-0.70.0 vendor/eac_ruby_utils/lib/eac_ruby_utils/struct.rb
avm-tools-0.69.3 vendor/eac_ruby_utils/lib/eac_ruby_utils/struct.rb
ehbrs-tools-0.14.0 vendor/eac_ruby_utils/lib/eac_ruby_utils/struct.rb
avm-tools-0.69.2 vendor/eac_ruby_utils/lib/eac_ruby_utils/struct.rb
eac_ruby_utils-0.46.0 lib/eac_ruby_utils/struct.rb