class StructuredReader::JSONReader::ObjectReader

Public Class Methods

new(strict: false, reader_set:) { |reader_builder(self, reader_set: reader_set)| ... } click to toggle source
# File lib/structured_reader.rb, line 62
def initialize(strict: false, reader_set:)
  @readers = {}
  @strict = strict
  yield ReaderBuilder.new(self, reader_set: reader_set)
  if @readers.empty?
    raise DeclarationError, "must define at least one field to read"
  end
  @object_klass = Struct.new(*@readers.keys)
  freeze
end

Public Instance Methods

field(key, field_name, reader) click to toggle source
# File lib/structured_reader.rb, line 93
def field(key, field_name, reader)
  @readers[key.to_sym] = [field_name, reader]
end
read(fragment, context) click to toggle source
# File lib/structured_reader.rb, line 73
def read(fragment, context)
  if fragment.kind_of?(Hash)
    result = @object_klass.new
    @readers.each do |key, (field, reader)|
      value = fragment[field] || fragment[field.to_sym]
      context.push(".#{field}") do |sub_context|
        result[key] = reader.read(value, sub_context)
      end
    end
    if @strict && ((excess_keys = fragment.keys.map(&:to_sym) - @readers.keys)).any?
      return context.flunk(fragment, "found strictly forbidden keys #{excess_keys.inspect}")
    end
    result.freeze

    context.accept(result)
  else
    return context.flunk(fragment, "expected a Hash")
  end
end