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