Sha256: 112f3e3ba53a3a4a10a532840ecae7fba10d94639dca7d3d1e42e57ffdaa0eb0

Contents?: true

Size: 1.59 KB

Versions: 2

Compression:

Stored size: 1.59 KB

Contents

# frozen_string_literal: true

module AdequateJson
  class Error < Base
    builder do |json, model, error, message, includes|
      json.error do
        json.code error
        json.message message
        if model
          json.details do
            includes_to_errors(model, includes, model.errors.messages.dup).each do |model_name, errors|
              json.set! model_name, errors
            end
          end
        end
      end
    end

    def initialize(model, error = nil, message = nil, includes = nil)
      super(model)
      @error = error
      @message = message
      @includes = includes
    end

    def includes_to_errors(model, includes, attributes = {})
      unless model.nil?
        each_inclusion(includes) do |child, value|
          submodel = model.send(child)
          subattributes = attributes[submodel.model_name.to_s.underscore] = submodel.errors.messages.dup
          includes_to_errors(submodel, value, subattributes)
        end
      end
      attributes
    end

    def each_inclusion(includes, &)
      unless includes.respond_to?(:keys)
        includes = [includes].flatten.compact.inject({}) do |hash, key|
          hash.tap do
            hash[key] = nil
          end
        end
      end
      includes.each(&)
    end

    def yield_builder(builder)
      Jbuilder.new do |json|
        instance_exec json, @model, @error, @message, @includes, &builder
      end
    end

    class << self
      def for(error, model = nil, includes = nil)
        new(model, error, I18n.t(error, scope: AdequateJson.configuration.i18n_errors_scope), includes)
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
adequate_json-0.2.0 lib/adequate_json/error.rb
adequate_json-0.1.0 lib/adequate_json/error.rb