Sha256: 0d7348a4d8c56dc19178e7b4dc9b17b93e55be82339417323db86ab803012ae3

Contents?: true

Size: 1.48 KB

Versions: 2

Compression:

Stored size: 1.48 KB

Contents

# -*- encoding: utf-8 -*-
# frozen_string_literal: true
module K
  module Replace
    module Keys
      def find_all(text)
        [].tap do |arr|
          text.scan(kreplace.key_pattern) do |match|
            yield match[0] if block_given?
            arr << match[0]
          end
        end.flatten.compact
      end

      def chain_properties(text)
        keys, obj = find_all(text), Hash.new
        obj.tap do |it|
          keys.each do |i|
            it.merge!(chain_property(i)) do |k, ov, nv|
              if ov.kind_of?(Array) && nv.kind_of?(Array)
                ov.concat(nv).uniq
              elsif ov.kind_of?(Array) && !nv.kind_of?(Array)
                ov.<<(nv).uniq
              else
                [ ov, nv ]
              end
            end
          end
        end
      end

      def chain_property(property)
        Hash.new.tap do |hash|
          hash.merge!(array_chain(property.split('.'))) do |k, ov, nv|
            if ov.kind_of?(Array) && nv.kind_of?(Array)
              ov.concat(nv).uniq
            else
              ov << nv if ov.kind_of?(Array)
            end
          end
        end
      end

      private

      def kreplace
        @kreplace ||= Replace.config
      end

      def array_chain(chains)
        return chains[0] if chains.size == 1
        chained = Hash.new
        chained.tap{|c| c["#{chains.shift}".downcase.to_sym] = array_chain(chains)}
      end
    end
  end
end

# { user: ["name", "email", address: ["street", "number"]] }

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
k-replace-1.0.0 lib/k/replace/keys.rb
k-replace-0.1.1 lib/k/replace/keys.rb