module MetaRPC::Callable::ClassMethods

Injected class methods

Public Instance Methods

handle_json_callable(method_name) click to toggle source
# File lib/metarpc/callable.rb, line 91
def handle_json_callable(method_name)
  old_method = instance_method(method_name)
  return if (@__json_rpc_hooked_methods ||= {}).key?(method_name)

  @__ignoring_added_methods = true
  params_contract = @__json_rpc_method_params
  error_handler = @__on_json_rpc_error

  define_method method_name do |*args, &block|
    case params_contract
    when nil
      raise_json_rpc_error(:invalid_params) unless args.empty?
    when Array
      validate_item(args, params_contract)
    when Hash
      raise_json_rpc_error(:invalid_params) unless args[0].is_a?(Hash)
      validate_item(args[0], params_contract)
    else
      raise_json_rpc_error(:internal_error)
    end

    old_method.bind(self).call(*args, &block)
  rescue RPCError => err
    raise err

  rescue StandardError => err
    error_handler&.call(err)
    raise_json_rpc_error(:server_error)
  end

  @__ignoring_added_methods = false
  @__json_rpc_hooked_methods[method_name] = {
    description: @__json_rpc_method_description,
    params: @__json_rpc_method_params
  }
end
json_rpc_method(description, params: nil) click to toggle source
# File lib/metarpc/callable.rb, line 132
def json_rpc_method(description, params: nil)
  @__next_method_is_json_rpc = true
  @__json_rpc_method_description = description
  @__json_rpc_method_params = params
end
json_rpc_methods() click to toggle source
# File lib/metarpc/callable.rb, line 87
def json_rpc_methods
  @__json_rpc_hooked_methods
end
method_added(method_name) click to toggle source
Calls superclass method
# File lib/metarpc/callable.rb, line 138
def method_added(method_name)
  super
  handle_json_callable(method_name) if @__next_method_is_json_rpc && !@__ignoring_added_methods
  @__next_method_is_json_rpc = false
end
on_json_rpc_error(&func) click to toggle source
# File lib/metarpc/callable.rb, line 128
def on_json_rpc_error(&func)
  @__on_json_rpc_error = func
end