Sha256: 71a2f305027fb51f1f1e4d85dcf558e9652745c35bea821564d01c443ab592d9

Contents?: true

Size: 1.21 KB

Versions: 1

Compression:

Stored size: 1.21 KB

Contents

# The result of back-end processing, which is essentially
# a container for constraint violations and arbitrary context.
class Brut::BackEnd::Result
  attr_reader :constraint_violations, :context

  def initialize
    @constraint_violations = {}
    @context = {}
  end

  def constraint_violation!(object:,
                            field:,
                            key:,
                            context: {})
    @constraint_violations[object] ||= {}
    @constraint_violations[object][field] ||= {}
    @constraint_violations[object][field][key] = context
  end

  def each_violation(&block)
    @constraint_violations.each do |object,fields|
      fields.each do |field,keys|
        keys.each do |key,context|
          block.(object,field,key,context)
        end
      end
    end
  end

  def []=(key_in_context,object)
    @context[key_in_context] = object
  end

  def [](key_in_context)
    @context.fetch(key_in_context)
  rescue KeyError => ex
    raise KeyError.new(
      "Context did not contain '#{key_in_context}' (#{key_in_context.class}). Context has these keys: #{@context.keys.join(',')}",
      receiver: ex.receiver,
      key: ex.key)
  end


  def constraint_violations? = self.constraint_violations.any?

end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
brut-0.0.1 lib/brut/back_end/result.rb