Class: StructuredReader::JSONReader::ObjectReader
- Inherits:
-
Object
- Object
- StructuredReader::JSONReader::ObjectReader
- Defined in:
- lib/structured_reader.rb
Defined Under Namespace
Classes: ReaderBuilder
Instance Method Summary collapse
- #field(key, field_name, reader) ⇒ Object
-
#initialize(strict: false, reader_set:) {|ReaderBuilder.new(self, reader_set: reader_set)| ... } ⇒ ObjectReader
constructor
A new instance of ObjectReader.
- #read(fragment, context) ⇒ Object
Constructor Details
#initialize(strict: false, reader_set:) {|ReaderBuilder.new(self, reader_set: reader_set)| ... } ⇒ ObjectReader
Returns a new instance of ObjectReader.
62 63 64 65 66 67 68 69 70 71 |
# 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 |
Instance Method Details
#field(key, field_name, reader) ⇒ Object
93 94 95 |
# File 'lib/structured_reader.rb', line 93 def field(key, field_name, reader) @readers[key.to_sym] = [field_name, reader] end |
#read(fragment, context) ⇒ Object
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
# 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 |