Class: StructuredReader::JSONReader::ObjectReader

Inherits:
Object
  • Object
show all
Defined in:
lib/structured_reader.rb

Defined Under Namespace

Classes: ReaderBuilder

Instance Method Summary collapse

Constructor Details

#initialize(strict: false, reader_set:) {|ReaderBuilder.new(self, reader_set: reader_set)| ... } ⇒ ObjectReader

Returns a new instance of ObjectReader.

Yields:



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