gitee.com/liuxuezhan/go-micro-v1.18.0@v1.0.0/server/grpc/handler.go (about)

     1  package grpc
     2  
     3  import (
     4  	"reflect"
     5  
     6  	"gitee.com/liuxuezhan/go-micro-v1.18.0/registry"
     7  	"gitee.com/liuxuezhan/go-micro-v1.18.0/server"
     8  )
     9  
    10  type rpcHandler struct {
    11  	name      string
    12  	handler   interface{}
    13  	endpoints []*registry.Endpoint
    14  	opts      server.HandlerOptions
    15  }
    16  
    17  func newRpcHandler(handler interface{}, opts ...server.HandlerOption) server.Handler {
    18  	options := server.HandlerOptions{
    19  		Metadata: make(map[string]map[string]string),
    20  	}
    21  
    22  	for _, o := range opts {
    23  		o(&options)
    24  	}
    25  
    26  	typ := reflect.TypeOf(handler)
    27  	hdlr := reflect.ValueOf(handler)
    28  	name := reflect.Indirect(hdlr).Type().Name()
    29  
    30  	var endpoints []*registry.Endpoint
    31  
    32  	for m := 0; m < typ.NumMethod(); m++ {
    33  		if e := extractEndpoint(typ.Method(m)); e != nil {
    34  			e.Name = name + "." + e.Name
    35  
    36  			for k, v := range options.Metadata[e.Name] {
    37  				e.Metadata[k] = v
    38  			}
    39  
    40  			endpoints = append(endpoints, e)
    41  		}
    42  	}
    43  
    44  	return &rpcHandler{
    45  		name:      name,
    46  		handler:   handler,
    47  		endpoints: endpoints,
    48  		opts:      options,
    49  	}
    50  }
    51  
    52  func (r *rpcHandler) Name() string {
    53  	return r.name
    54  }
    55  
    56  func (r *rpcHandler) Handler() interface{} {
    57  	return r.handler
    58  }
    59  
    60  func (r *rpcHandler) Endpoints() []*registry.Endpoint {
    61  	return r.endpoints
    62  }
    63  
    64  func (r *rpcHandler) Options() server.HandlerOptions {
    65  	return r.opts
    66  }