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