module GrpcKit::Grpc::Dsl

Methods under GrpcKit::Grpc::Dsl is available for classes include GRPC::GenericService. See also: GrpcKit::Grpc::GenericService

Attributes

marshal_class_method[W]

@param value [Symbol]

service_name[RW]

@param value [String]

unmarshal_class_method[W]

@param value [Symbol]

Public Class Methods

new(*, **) click to toggle source
Calls superclass method
# File lib/grpc_kit/grpc/dsl.rb, line 73
def initialize(*, **)
  @rpcs = {}
  super
end

Public Instance Methods

inherited(subclass) click to toggle source
# File lib/grpc_kit/grpc/dsl.rb, line 22
def inherited(subclass)
  subclass.rpc_descs.merge!(rpc_descs)
  subclass.service_name = @service_name
end
rpc(name, marshal, unmarshal) click to toggle source

@param name [Symbol] gRPC method name @param marshal [Class, GrpcKit::Grpc::Stream] marshaling object @param unmarshal [Class, GrpcKit::Grpc::Stream] unmarshaling object @return [void]

# File lib/grpc_kit/grpc/dsl.rb, line 31
def rpc(name, marshal, unmarshal)
  if rpc_descs.key?(name)
    raise "rpc (#{name}) is already defined"
  end

  unless marshal.respond_to?(@marshal_class_method)
    raise "#{marshal} must implement #{marshal}.#{@marshal_class_method}"
  end

  unless unmarshal.respond_to?(@unmarshal_class_method)
    raise "#{unmarshal} must implement #{unmarshal}.#{@unmarshal_class_method}"
  end

  rpc_desc = GrpcKit::RpcDesc.new(
    name: name,
    marshal: marshal,
    unmarshal: unmarshal,
    marshal_method: @marshal_class_method,
    unmarshal_method: @unmarshal_class_method,
    service_name: @service_name,
  )
  rpc_descs[rpc_desc.path] = rpc_desc

  # Should use `*` since each rpc's sigunature is different.
  define_method(rpc_desc.ruby_style_name) do |*|
    raise GrpcKit::Errors::Unimplemented, "Method not found: #{name}"
  end
end
rpc_descs() click to toggle source

@return [Hash<String,GrpcKit::RpcDesc>]

# File lib/grpc_kit/grpc/dsl.rb, line 110
def rpc_descs
  @rpc_descs ||= {}
end
rpc_stub_class() click to toggle source

@return [GrpcKit::Client]

# File lib/grpc_kit/grpc/dsl.rb, line 66
def rpc_stub_class
  rpc_descs_ = {}
  rpc_descs.each_value do |rpc_desc|
    rpc_descs_[rpc_desc.ruby_style_name] = rpc_desc
  end

  Class.new(GrpcKit::Client) do
    def initialize(*, **)
      @rpcs = {}
      super
    end

    define_method(:build_rpcs) do |interceptors, **options|
      rpc_descs_.each do |method_name, rpc_desc|
        @rpcs[method_name] = rpc_desc.build_client(interceptors: interceptors, **options)
      end
    end
    private :build_rpcs

    rpc_descs_.each do |method_name, rpc_desc|
      if rpc_desc.request_response?
        define_method(method_name) do |request, **opts|
          request_response(@rpcs.fetch(method_name), request, **opts)
        end
      elsif rpc_desc.client_streamer?
        define_method(method_name) do |**opts|
          client_streamer(@rpcs.fetch(method_name), **opts)
        end
      elsif rpc_desc.server_streamer?
        define_method(method_name) do |request, **opts|
          server_streamer(@rpcs.fetch(method_name), request, **opts)
        end
      elsif rpc_desc.bidi_streamer?
        define_method(method_name) do |requests, **opts, &blk|
          bidi_streamer(@rpcs.fetch(method_name), requests, **opts, &blk)
        end
      else
        raise "unknown #{rpc_desc}"
      end
    end
  end
end
stream(cls) click to toggle source

@return [GrpcKit::Grpc::Stream]

# File lib/grpc_kit/grpc/dsl.rb, line 61
def stream(cls)
  GrpcKit::Grpc::Stream.new(cls)
end