class Jsoning::Protocol

takes care of the class

Attributes

klass[R]
version_instances[R]

Public Class Methods

new(klass) click to toggle source
# File lib/jsoning/foundations/protocol.rb, line 6
def initialize(klass)
  @klass = klass
  @version_instances = {}

  # each protocol has a default version named :default
  add_version(:default)

  self
end

Public Instance Methods

add_version(version_name) click to toggle source

add a new version, a protocol can handle many version to export the JSON

# File lib/jsoning/foundations/protocol.rb, line 18
def add_version(version_name)
  unless version_name.is_a?(String) || version_name.is_a?(Symbol)
    fail "Version name must be either a String or a Symbol"
  end
  version = Jsoning::Version.new(self)
  version.version_name = version_name
  @version_instances[version.version_name] = version
  version
end
construct_hash_from(json_string, version_name) click to toggle source

construct hash from given JSON

# File lib/jsoning/foundations/protocol.rb, line 65
def construct_hash_from(json_string, version_name)
  data = {}

  # make all json obj keys to downcase, symbol
  json_obj = JSON.parse(json_string)
  json_obj = Hash[json_obj.map { |k, v| [k.to_s.downcase, v]}]

  version = get_version!(version_name)
  version.mappers_order.each do |mapper_sym|
    mapper = version.mapper_for(mapper_sym)
    mapper_key_name = mapper.name.to_s.downcase
    
    mapper_default_value = mapper.default_value
    mapper_key_value = json_obj[mapper_key_name]
    # retrieve value from key, if not available, from default
    value = mapper_key_value || mapper_default_value

    if value.nil? && !mapper.nullable?
      raise Jsoning::Error, "Constructing hash failed due to #{mapper_key_name} being nil when it is not allowed to" 
    end

    data[mapper_key_name] = value
  end

  data
end
get_version(version_name) click to toggle source

retrieve a defined version, or return nil if undefined

# File lib/jsoning/foundations/protocol.rb, line 29
def get_version(version_name)
  @version_instances[version_name.to_s]
end
get_version!(version_name) click to toggle source

retrieve a defined version, or fail if undefined

# File lib/jsoning/foundations/protocol.rb, line 34
def get_version!(version_name)
  version = get_version(version_name)
  fail Jsoning::Error, "Unknown version: #{version_name}" if version.nil?
  version
end
retrieve_values_from(object, options) click to toggle source

construct the JSON from given object options:

- version: the version to be used for processing
# File lib/jsoning/foundations/protocol.rb, line 43
def retrieve_values_from(object, options)
  # user will pass in version, rather than version_name, although actually
  # it is a version_name instead of version instance
  version_name = options[:version]
  # use default if version is undefined
  version = get_version(version_name) || get_version(:default)

  # hold data here
  data = {}

  version.mappers_order.each do |mapper_sym|
    mapper = version.mapper_for(mapper_sym)
    # version_name and version may be different, that is when the user uses version
    # that is not yet defined, therefore, will fall to default. therefore, user
    # version_name as this is what is requested by the caller
    mapper.extract(object, version_name, data)
  end

  data
end