lib/saorin/request.rb in saorin-0.1.4 vs lib/saorin/request.rb in saorin-0.2.0
- old
+ new
@@ -1,20 +1,26 @@
require 'saorin'
require 'saorin/error'
+require 'saorin/utility'
require 'multi_json'
module Saorin
class Request
attr_accessor :version, :method, :params, :id
- def initialize(method, params, id = nil, version = Saorin::JSON_RPC_VERSION)
- @version = version
+ def initialize(method, params, options = {})
+ @version = options[:version] || Saorin::JSON_RPC_VERSION
@method = method
@params = params
- @id = id
+ @id = options[:id]
+ @notify = !options.has_key?(:id)
end
+ def notify?
+ @notify
+ end
+
def valid?
return false unless @method && @version
return false unless [String].any? { |type| @version.is_a? type }
return false unless [String].any? { |type| @method.is_a? type }
return false unless [Hash, Array, NilClass].any? { |type| @params.is_a? type }
@@ -31,20 +37,31 @@
def to_h
h = {}
h['jsonrpc'] = @version
h['method'] = @method
h['params'] = @params if @params && !@params.empty?
- h['id'] = @id
+ h['id'] = @id unless notify?
h
end
def to_json(*args)
options = args.last.is_a?(::Hash) ? args.pop : {}
MultiJson.dump to_h, options
end
+ def self.symbolized_keys(hash)
+ hash.each do |k, v|
+ if k.is_a? ::String
+ hash[k.to_sym] = v
+ end
+ end
+ end
+
def self.from_hash(hash)
raise Saorin::InvalidRequest unless hash.is_a?(::Hash)
- new *hash.values_at('method', 'params', 'id', 'jsonrpc')
+ options = hash.dup
+ method = options.delete('method')
+ params = options.delete('params')
+ new method, params, Saorin::Utility.symbolized_keys(options)
end
end
end