Module: JSON

Defined in:
lib/json/mapping.rb,
lib/json/mapping/version.rb

Defined Under Namespace

Classes: Mapping

Class Method Summary collapse

Class Method Details

.mapping(klass, fields) ⇒ Object



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/json/mapping.rb', line 11

def self.mapping(klass, fields)
  fields.each do |name, typ|
    klass.attr_reader name
    klass.define_method "#{name}=" do |value|
      value = typ.new(value) if typ.respond_to?(:from_json)
      unless value.is_a?(typ)
        raise JSON::Mapping::Error, "Wrong field type #{self.class} for '#{name}' - should be '#{typ}'"
      end

      instance_variable_set "@#{name}", value
    end
  end

  klass.define_method :initialize do |params = {}|
    params.each do |name, value|
      unless fields.key?(name.to_sym)
        raise JSON::Mapping::Error, "Missing field definition for '#{name}'"
      end

      send("#{name}=", value)
    end
  end

  klass.define_singleton_method :from_json do |string|
    klass.new(JSON.parse(string))
  end
end