Module: MetaRPC::Callable
- Defined in:
- lib/metarpc/callable.rb
Overview
Module used to describe callable JSON RPC methods
Defined Under Namespace
Modules: ClassMethods
Class Method Summary collapse
Instance Method Summary collapse
- #json_rpc_error(code) ⇒ Object
- #validate_array(args, contract) ⇒ Object
- #validate_hash(args, contract) ⇒ Object
- #validate_item(item, contract_type) ⇒ Object
Class Method Details
.included(klass) ⇒ Object
4 5 6 7 |
# File 'lib/metarpc/callable.rb', line 4 def self.included(klass) super klass.send(:extend, ClassMethods) end |
Instance Method Details
#json_rpc_error(code) ⇒ Object
9 10 11 |
# File 'lib/metarpc/callable.rb', line 9 def json_rpc_error(code) raise RPCError.new(code), "Failed to call JSON RPC method : #{code}" end |
#validate_array(args, contract) ⇒ Object
53 54 55 56 57 |
# File 'lib/metarpc/callable.rb', line 53 def validate_array(args, contract) contract.each_with_index do |contract_type, i| validate_item(args[i], contract_type) end end |
#validate_hash(args, contract) ⇒ Object
59 60 61 62 63 64 65 |
# File 'lib/metarpc/callable.rb', line 59 def validate_hash(args, contract) contract.each do |arg_name, contract_type| raise json_rpc_error(:invalid_params) unless args.key?(arg_name) validate_item(args[arg_name], contract_type) end end |
#validate_item(item, contract_type) ⇒ Object
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 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
# File 'lib/metarpc/callable.rb', line 13 def validate_item(item, contract_type) case contract_type when Hash validate_hash(item, contract_type) when Array validate_array(item, contract_type) when Class raise json_rpc_error(:invalid_params) unless item.is_a?(contract_type) when String klass, nullable, spread = if contract_type.end_with?('!') [contract_type.delete('!').constantize, true, false] elsif contract_type.end_with?('!...') [contract_type.delete('!...').constantize, true, true] elsif contract_type.end_with?('...') [contract_type.delete('...').constantize, false, true] else [contract_type.constantize, false, false] end if spread raise json_rpc_error(:invalid_params) unless item.is_a?(Array) item.each do |sub_item| next if sub_item.nil? && nullable raise json_rpc_error(:invalid_params) unless sub_item.present? && sub_item.is_a?(klass) end else return if item.nil? && nullable raise json_rpc_error(:invalid_params) unless item.present? && item.is_a?(klass) end else raise json_rpc_error(:internal_error) end rescue NameError raise json_rpc_error(:internal_error) end |