Sha256: 78464d2447380b0400ad6cfc372c3a01423283bde9af07fcb55302bac5ba4228

Contents?: true

Size: 1.44 KB

Versions: 1

Compression:

Stored size: 1.44 KB

Contents

# frozen_string_literal: true

module ReSorcery
  module Fielded
    module ExpandInternalFields
      extend Helpers

      # Used internally to expand deeply nested `Fielded` structures
      #
      # `Hash` is intentionally *not* expanded. Create a `Fielded` class instead.
      #
      # Similarly, `nil` is intentionally rejected here. Use a type that more
      # meaningfully represents an empty value instead.
      def self.expand(obj)
        case obj
        when ReSorcery
          obj.resource
        when Fielded
          obj.fields
        when Linked
          obj.links
        when String, Numeric, Symbol, TrueClass, FalseClass
          ok(obj)
        when Array
          expand_for_array(obj)
        when URI
          ok(obj.to_s)
        when Hash
          err("`Hash` cannot be safely expanded as a `field`. Use a `Fielded` class instead.")
        when NilClass
          err("`nil` cannot be returned as a `field`")
        else
          err("Cannot deeply expand fields of class #{obj.class}")
        end
      end

      def self.expand_for_array(array)
        array.each_with_index.inject(ok([])) do |result_array, (element, index)|
          result_array.and_then do |ok_array|
            expand(element)
              .map { |good| ok_array << good }
              .map_error { |error| "Error at index `#{index}` of Array: #{error}" }
          end
        end
      end
    end
    private_constant :ExpandInternalFields
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
re_sorcery-0.1.0 lib/re_sorcery/fielded/expand_internal_fields.rb