module NanoRpc::Proxy
Attributes
node[R]
Public Class Methods
new(opts = {})
click to toggle source
# File lib/nano_rpc/proxy.rb, line 5 def initialize(opts = {}) @node = @node || opts[:node] || NanoRpc.node proxy_methods.each { |meth, _| define_proxy_method(meth) } end
Private Instance Methods
allowed_params()
click to toggle source
# File lib/nano_rpc/proxy.rb, line 87 def allowed_params base_param_keys + required_params + optional_params end
base_param_keys()
click to toggle source
# File lib/nano_rpc/proxy.rb, line 101 def base_param_keys proxy_params.keys end
base_params()
click to toggle source
# File lib/nano_rpc/proxy.rb, line 26 def base_params @base_params ||= proxy_params.each_with_object({}) do |(k, v), params| params[k] ||= send(v) end end
define_proxy_method(meth)
click to toggle source
# File lib/nano_rpc/proxy.rb, line 12 def define_proxy_method(meth) self.class.send(:define_method, method_alias(meth)) do |args = {}| @meth = meth @call_args = args validate_params execute_call end end
drop_nil_params()
click to toggle source
# File lib/nano_rpc/proxy.rb, line 79 def drop_nil_params @call_args.delete_if { |_k, v| v.nil? } end
ensure_required_params()
click to toggle source
# File lib/nano_rpc/proxy.rb, line 65 def ensure_required_params missing_params = required_params - opts_keys return unless missing_params.any? raise NanoRpc::MissingParameters, "Missing required parameter(s): #{missing_params.join(', ')}" end
execute_call()
click to toggle source
# File lib/nano_rpc/proxy.rb, line 21 def execute_call result = node.call(@meth, @call_args) expose_nested_data(result) end
expose_nested_data(data)
click to toggle source
If single-key response matches method name, expose nested data
# File lib/nano_rpc/proxy.rb, line 39 def expose_nested_data(data) if data.is_a?(Hash) && data.keys.map(&:to_s) == [@meth.to_s] return data[@meth] end data end
method_alias(meth)
click to toggle source
Nano `send` action is also the method caller in Ruby ;)
# File lib/nano_rpc/proxy.rb, line 34 def method_alias(meth) meth == :send ? :send_currency : meth end
optional_params()
click to toggle source
# File lib/nano_rpc/proxy.rb, line 96 def optional_params return [] unless proxy_methods[@meth] proxy_methods[@meth][:optional] || [] end
opts_keys()
click to toggle source
# File lib/nano_rpc/proxy.rb, line 83 def opts_keys @call_args.is_a?(Hash) ? @call_args.keys : [] end
prepare_params()
click to toggle source
# File lib/nano_rpc/proxy.rb, line 53 def prepare_params # Allow non-Hash literal argument if this method requires single param # Ex `create('new')` vs `create(name: 'new')` @call_args = if required_params.size == 1 && !@call_args.is_a?(Hash) { required_params.first => @call_args } else @call_args.is_a?(Hash) ? @call_args : {} end @call_args.merge!(base_params) if base_params end
prevent_forbidden_params()
click to toggle source
# File lib/nano_rpc/proxy.rb, line 72 def prevent_forbidden_params forbidden_params = base_param_keys + opts_keys - allowed_params return unless forbidden_params.any? raise NanoRpc::ForbiddenParameter, "Forbidden parameter(s) passed: #{forbidden_params.join(', ')}" end
required_params()
click to toggle source
# File lib/nano_rpc/proxy.rb, line 91 def required_params return [] unless proxy_methods[@meth] proxy_methods[@meth][:required] || [] end
validate_params()
click to toggle source
# File lib/nano_rpc/proxy.rb, line 46 def validate_params prepare_params ensure_required_params prevent_forbidden_params drop_nil_params end