Sha256: c2b4e05eb78f226631267aa33be9b99b03de5e3e39b0bd34651ad89435b8413d

Contents?: true

Size: 1.57 KB

Versions: 1

Compression:

Stored size: 1.57 KB

Contents

# The Request class models a specific type of Sanford message body and provides
# a defined structure for it. A request requires a message body to contain a
# version, name and params.

module Sanford; end
module Sanford::Protocol

  BadRequestError = Class.new(RuntimeError)

  class Request

    def self.parse(body)
      self.new(body['version'], body['name'], body['params'])
    end

    attr_reader :version, :name, :params

    def initialize(version, name, params)
      self.validate!(version, name, params)
      @version, @name, @params = version, name, params
    end

    def to_hash
      { 'version' => version,
        'name'    => name,
        'params'  => self.stringify(params)
      }
    end

    def to_s; "[#{version}] #{name}"; end

    def inspect
      reference = '0x0%x' % (self.object_id << 1)
      "#<#{self.class}:#{reference}"\
      " @version=#{version.inspect}"\
      " @name=#{name.inspect}"\
      " @params=#{params.inspect}>"
    end

    protected

    def validate!(version, name, params)
      problem = if !version
        "The request doesn't contain a version."
      elsif !name
        "The request doesn't contain a name."
      elsif !params.kind_of?(Hash)
        "The request's params are not a valid BSON document."
      end
      raise(BadRequestError, problem) if problem
    end

    def stringify(object)
      case(object)
      when Hash
        object.inject({}){|h, (k, v)| h.merge({ k.to_s => self.stringify(v) }) }
      when Array
        object.map{|item| self.stringify(item) }
      else
        object
      end
    end

  end

end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
sanford-protocol-0.5.6 lib/sanford-protocol/request.rb