Sha256: 1e21a2ec265df47ac40086626faa8ddccd15301b2623a181297c671393ec888f

Contents?: true

Size: 1.45 KB

Versions: 12

Compression:

Stored size: 1.45 KB

Contents

# frozen_string_literal: true

module DHS::Problems
  module Nested
    module Base
      # Filters base errors by scope
      # and reduces key by given scope name;
      # returns plain array if end of tree is reached
      def nest(messages, scope = nil)
        scope = translate_rails_to_api_scope(scope)
        return messages unless scope
        messages = messages.select do |key, _|
          key.match(/^#{scope}/)
        end
        # if only one key and this key has no dots, exit with plain
        if reached_leaf?(messages)
          messages.first[1]
        else
          remove_scope(messages, scope)
        end
      end

      # Identifies if the end of nested errors tree is reached
      def reached_leaf?(messages)
        messages.keys.length == 1 &&
          !messages.first[0].match(/\./)
      end

      # Removes scope from given messages' key
      def remove_scope(messages, scope)
        messages.each_with_object({}) do |element, hash|
          key = element[0].to_s.gsub(/^#{scope}\./, '')
          hash[key.to_sym] = element[1]
        end
      end

      # Translates rails like accessors for collections
      # like first, second, last to api error paths
      def translate_rails_to_api_scope(scope)
        case scope
        when :first
          0
        when :second
          1
        when :last
          return values.length - 1 if messages.present?
          0
        else
          scope
        end
      end
    end
  end
end

Version data entries

12 entries across 12 versions & 1 rubygems

Version Path
dhs-1.6.0 lib/dhs/problems/nested/base.rb
dhs-1.5.0 lib/dhs/problems/nested/base.rb
dhs-1.4.2 lib/dhs/problems/nested/base.rb
dhs-1.4.1 lib/dhs/problems/nested/base.rb
dhs-1.4.0 lib/dhs/problems/nested/base.rb
dhs-1.3.0 lib/dhs/problems/nested/base.rb
dhs-1.2.0 lib/dhs/problems/nested/base.rb
dhs-1.1.0 lib/dhs/problems/nested/base.rb
dhs-1.0.3 lib/dhs/problems/nested/base.rb
dhs-1.0.2 lib/dhs/problems/nested/base.rb
dhs-1.0.1 lib/dhs/problems/nested/base.rb
dhs-1.0.0 lib/dhs/problems/nested/base.rb