Sha256: a5e8102fd886e5eedaa7d8056896fcc370b591d944d186055dd925c0f249e9f8

Contents?: true

Size: 1.56 KB

Versions: 1

Compression:

Stored size: 1.56 KB

Contents

require 'active_support/core_ext/module/delegation'

module JSONAPIonify
  module Api
    class ErrorsObject

      delegate :present?, to: :collection

      class Evaluator
        Structure::Objects::Error.permitted_keys.each do |key|
          define_method(key) do |value|
            @error[key] = value
          end
        end

        def initialize(error)
          @error = error
          freeze
        end

        def meta
          JSONAPIonify::Structure::Helpers::MetaDelegate.new @error
        end

        def pointer(value)
          @error[:source]           ||= {}
          @error[:source][:pointer] = value
        end

        def parameter(value)
          @error[:source]             ||= {}
          @error[:source][:parameter] = value
        end
      end

      def evaluate(*args, error_block:, runtime_block:, backtrace: nil)
        backtrace ||= caller
        error     = Structure::Objects::Error.new
        evaluator = Evaluator.new(error)
        collection << error
        [runtime_block, error_block].each do |block|
          evaluator.instance_exec(*args, &block) if block
        end
        unless ENV['RACK_ENV'] == 'production'
          error[:meta]             ||= {}
          error[:meta][:backtrace] = backtrace
        end
      end

      def top_level
        JSONAPIonify.new_object.tap do |obj|
          obj[:errors] = collection
        end
      end

      def collection
        @collection ||= Structure::Collections::Errors.new
      end

      def set(collection)
        @collection = collection
      end

    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
jsonapionify-0.9.0 lib/jsonapionify/api/errors_object.rb