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