class RailsTwirp::RouteSet::ServiceRouteSet

Attributes

rpcs[R]

Public Class Methods

new(service_class) click to toggle source
# File lib/rails_twirp/route_set.rb, line 30
def initialize(service_class)
  @service_class = service_class
  @rpcs = {}
end

Public Instance Methods

add_route(name, mapping) click to toggle source
# File lib/rails_twirp/route_set.rb, line 35
def add_route(name, mapping)
  if @rpcs[name]
    raise ArgumentError, "Invalid RPC, route already defined: #{name}"
  end

  @rpcs[name] = mapping
end
to_service() click to toggle source
# File lib/rails_twirp/route_set.rb, line 43
def to_service
  # Synthesize a handler that will process the requests
  #
  handler = Class.new
  @rpcs.each do |name, mapping|
    rpc_info = @service_class.rpcs[name]
    raise UnknownRpcError, "Unknown RPC #{name} on #{@service_class.service_name} service" unless rpc_info
    method_name = rpc_info[:ruby_method]

    # Stolen from Rails in ActionDispatch::Request#controller_class_for
    action_name = mapping.action
    response_class = rpc_info[:output_class]

    handler.define_method(method_name) do |req, env|
      controller_name = mapping.controller.underscore
      const_name = controller_name.camelize << "Controller"
      controller_class = ::ActiveSupport::Dependencies.constantize(const_name)
      controller_class.dispatch(action_name, req, response_class, env)
    end
  end

  service = @service_class.new(handler.new)
  service.before do |rack_env, env|
    env[:rack_env] = rack_env
  end
  service
end